反射 父類

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

現有每多個javabean,可是每一個bean中都有不一樣的屬性,而且都是經過get和set方法來修改和獲取值。若是調試一步一步去猜內部結構,想用一個方法能夠獲取不一樣對像中各個屬性的值,怎麼辦呢?能夠利用JAVA的反射機制。java

1.此爲小引.net

//運用反射機制遍歷單個對像中每一個屬性值
    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中每一個屬性的值,連父類的屬性值也能夠一併得到。htm

    
    @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();
        }
    }blog

 


    
    //遞歸遍歷類及父類的屬性值
    @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());
         }
    }遞歸

相關文章
相關標籤/搜索