• 反射 父类


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

  • 相关阅读:
    iOS开发
    Xcode
    UITextField
    iOS
    过场动画
    iOS 网络状态监听和检查,
    线程互动,GCD小应用,(功能实现并代码聚集---加载动画,弹框AlertView定时消失。)
    drawRect: 小注
    FMDB_and_Sqlite3
    UIGestureRecognizer手势。
  • 原文地址:https://www.cnblogs.com/sode/p/3229186.html
Copyright © 2020-2023  润新知