2017-04-17 60 views
0

爲什麼variable2的值爲空,如果我使用Reflection API實例化類?如何使用反射api訪問bean類的getter方法?

其中,Variable1的值按照集合正確返回,這裏我正常實例化對象。 如何使用ReflectionAPI獲得variable2的值?

package com.OP.app; 

    public class Bean { 

    private String variable1; 
    private String variable2; 
    public String getVariable1() { 
     return variable1; 
    } 
    public void setVariable1(String variable1) { 
     this.variable1 = variable1; 
    } 
    public String getVariable2() { 
     return variable2; 
    } 
    public void setVariable2(String variable2) { 
     this.variable2 = variable2; 
    } 


} 

package com.OP.app; 

import java.lang.reflect.Method; 

public class ObjectCall { 

    public static void main(String []args){ 
     Bean beanobject = new Bean(); 
     beanobject.setVariable1("Ram"); 
     beanobject.setVariable2("Rakesh"); 
     System.out.println(beanobject.getVariable1()); 
     String path = "com.OP.app.Bean"; 
     Class<?> newClass; 
     try { 
      newClass = Class.forName(path); 
      Object obj = newClass.newInstance(); 
      String getMethod = "getVariable2"; 
      Method getNameMethod = obj.getClass().getMethod(getMethod); 
      String name = (String) getNameMethod.invoke(obj); 
      System.out.println(name); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } // convert string classname to class 
     } 
    } 

輸出: 拉姆 空

回答

0

也就是說beause要調用它不具有variable1variable2設定值,新創建的對象的方法(如obj),例如:

Object obj = newClass.newInstance(); 

以上將創建一個新的ObjectBean類與null VA提供variable1variable2。如果要打印beanobject方法中設置的值,則需要使用beanobject調用getter方法。即

String name = (String) getNameMethod.invoke(obj); 

String name = (String) getNameMethod.invoke(beanobject); 
0

您創造一個沒有值設定目標類的新實例改變。

Object obj = newClass.newInstance();   
Method getNameMethod = obj.getClass().getMethod(getMethod); 

改變這一行,它應該工作:

Method getNameMethod = beanobject.getClass().getMethod(getMethod); 

附加: 你的變量命名不是很好。我會重構代碼以達到更好的閱讀效果:

public static void main(String[] args) { 
    Bean beanInstance = new Bean(); 
    beanInstance.setVariable1("Ram"); 
    beanInstance.setVariable2("Rakesh"); 

    System.out.println("Value 1 of fresh bean instance: " + beanInstance.getVariable1()); 

    String beanType = Bean.class.getName(); 
    Class<?> beanClazz; 

    try { 
     beanClazz = Class.forName(beanType); 

     String getterMethodName = "getVariable2"; 
     Method getterMethod = beanClazz.getMethod(getterMethodName); 
     Object returnValue = getterMethod.invoke(beanInstance); 

     System.out.println("Value 2 of by reflection loaded bean instance: " + String.valueOf(returnValue)); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } // convert string classname to class 
} 
+0

這不起作用:'Class.forName'需要完整的類名,而不是包名。但是'Class beanClazz = Bean.class;'無論如何都比較容易。 – CoronA

+0

你說得對。這個bean類需要完整的類名(getName()這樣做)。 'Class beanClazz = Bean.class;'比較容易,但是如果只在運行時才知道類,那麼硬編碼類聲明就無法做任何事情。 –