反射 父类

简介: 引用: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());
         }
    }

目录
打赏
0
0
0
0
22
分享
相关文章
C# 继承类中(父类与子类)构造函数的调用顺序
C# 继承类中(父类与子类)构造函数的调用顺序
|
8月前
|
【反射】Java反射机制 -- 常用构造器与方法
【反射】Java反射机制 -- 常用构造器与方法
79 0
|
6月前
|
子类的父类和接口具有共同的方法
子类的父类和接口具有共同的方法
39 7
Java反射(通过反射获取构造函数、方法、属性)
1.通过反射获取构造函数,2.通过反射获取方法,3.通过反射调用成员属性
136 0
子类到底能不能继承父类的私有属性?
继承就像是我们现实生活中的父子关系,儿子可以遗传父亲的一些特性,在面向对象语言中,就是一个类可以继承另一个类的一些特性,从而可以代码重用,其实继承体现的是is-a关系,父类同子类在本质上还是一类实体;子类通过继承父类的属性的行为,我们称之为继承。Java只支持单继承,不支持多继承。因为多继承容易带来安全隐患:当多个父类定义相同的功能,当功能内容不同的时候,子类对象不确定要运行哪一个,在Java中用另一种形式体现出来,就是接口的多实现。
子类重写父类方法|学习笔记
快速学习子类重写父类方法,先来介绍子类重写父类方法。多态其实就是一种子类重写父类的方法。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等