利用java反射遍曆類以及父類的方法

來源:互聯網
上載者:User

現有每多個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());
         }
    }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.