反射 父类

简介: 引用:http://www.blogjava.net/jxlazzw/articles/389452.html 现有每多个javabean,但是每个bean中都有不同的属性,并且都是通过get和set方法来修改和获取值。

引用:http://www.blogjava.net/jxlazzw/articles/389452.html

现有每多个javabean,但是每个bean中都有不同的属性,并且都是通过get和set方法来修改和获取值。如果调试一步一步去猜内部结构,想用一个方法可以获取不同对像中各个属性的值,怎么办呢?可以利用JAVA的反射机制。

1.此为小引

//运用反射机制遍历单个对像中每个属性值
    public static void Reflect_Object(Object o,String classPath){
        try {
            Class userClass = Class.forName(classPath);//加载类
               Method[] methods = userClass.getDeclaredMethods();//获得类的方法集合       
               //遍历方法集合
               for(int i =0 ;i<methods.length;i++){
                  //获取所有getXX()的返回值
                  //methods[i].getName()方法返回方法名
                  if(methods[i].getName().startsWith("get")){
                      Object object = methods[i].invoke(o, null);
                      System.out.println(" "+methods[i].getName()+"="+object);
                  }
               }
               System.out.println("====");
           } catch (Exception e) {
               e.printStackTrace();
           }
    }

 

 

2.若遍历的bean有父类,则方法1则取不到父类中各个属性的值,故本类为扩充,不仅可以取到bean中每个属性的值,连父类的属性值也可以一并获得。

    
    @SuppressWarnings("unchecked")
    public static void Reflect_Object(Object o,String classPath){
        try {            
            Class _class = Class.forName(classPath);// 加载类
//            Method[] methods = _class.getDeclaredMethods();// 获得类的方法集合
            recursive(o,_class);
            // 遍历方法集合
//            for (int i = 0; i < methods.length; i++) {
//                // 获取所有getXX()的返回值
//                if (methods[i].getName().startsWith("get")) {// 方法返回方法名
//                    methods[i].setAccessible(true);//允许private被访问(以避免private getXX())
//                    Object object = methods[i].invoke(o, null);
//                    System.out.println(" " + methods[i].getName() + "=" + object);
//                }
//            }
            // 遍历父类方法集合
//            if (_class.getGenericSuperclass() != null) {
//                Class superClass = _class.getSuperclass();// 父类
//                Method[] superMethods = superClass.getDeclaredMethods();//父类方法
//                for (int j = 0; j < superMethods.length; j++) {
//                    // 获取所有getXX()的返回值 Method method :
//                    if (superMethods[j].getName().startsWith("get")) {// 方法返回方法名
//                        methods[j].setAccessible(true);//允许private被访问
//                        Object object = superMethods[j].invoke(o, null);
//                        System.out.println(" " + superMethods[j].getName()+ "=" + object);
//                    }
//                }
//                Field[] fields = superClass.getDeclaredFields();//父类变量
//                for(Field field : fields) {
//                    System.out.println(field);
//                }
//            }
            System.out.println("====");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 


    
    //递归遍历类及父类的属性值
    @SuppressWarnings("unchecked")
    public static Class recursive(Object o,Class _class){
        if(_class==null)
         return null;
         else{
            Method[] methods = _class.getDeclaredMethods();// 获得类的方法集合
            // 遍历方法集合
            for (int i = 0; i < methods.length; i++) {
                // 获取所有getXX()的返回值
                if (methods[i].getName().startsWith("get")) {// 方法返回方法名
                    methods[i].setAccessible(true);//允许private被访问(以避免private getXX())
                    Object object;
                    try {
                        object = methods[i].invoke(o, null);
                        System.out.println(" " + methods[i].getName() + "=" + object);
                    } catch (IllegalArgumentException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
            System.out.println("===="+_class.getName());
            return recursive(o,_class.getSuperclass());
         }
    }

相关文章
|
Oracle Java 关系型数据库
SpringBoot整合ELK做日志(超完整)(上)
SpringBoot整合ELK做日志(超完整)(上)
489 0
|
JavaScript
js 解析 byte数组 成字符串
js 解析 byte数组 成字符串
280 5
|
XML Java 开发者
Spring框架: 什么是依赖注入(Dependency Injection)?
Spring框架: 什么是依赖注入(Dependency Injection)?
374 2
|
监控 Java Maven
使用AspectJ实现Java代码的运行时织入
使用AspectJ实现Java代码的运行时织入
|
存储 Java Linux
Android系统获取event事件回调等几种实现和原理分析
Android系统获取event事件回调等几种实现和原理分析
1048 0
|
缓存 小程序 Java
别再造反射轮子了,Spring中ReflectionUtils 工具类,应有尽有!
ReflectionUtils是spring针对反射提供的工具类。
|
Dubbo Java 应用服务中间件
SpringBoot 调用外部接口的三种方式
SpringBoot 调用外部接口的三种方式
869 1
|
设计模式 监控 Java
字节码插桩(二): AspectJ + GradlePlugin
作为Android开发,多多少少遇到过这种情况,我的App很卡,大概知道问题出现在哪?却无从下手,接受别人的工程代码写的一团糟,出现天大的bug,却因为不熟悉业务不敢乱动,有没有一种侵入性比较低,比较和谐的方式去修改业务代码呢  学习设计模式可以一定程度降低业务耦合度,不过那都是 OOP 的思想,今天我给大家带来一份 AOP 的切面编程思想,无侵入方式织入代码到业务。
444 0
字节码插桩(二): AspectJ + GradlePlugin
|
Shell
遇到INSTALL_FAILED_VERIFICATION_FAILURE怎么办
遇到INSTALL_FAILED_VERIFICATION_FAILURE怎么办
1378 0