2017-04-17 86 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;'比较容易,但是如果只在运行时才知道类,那么硬编码类声明就无法做任何事情。 –

相关问题