如何使用反射api访问bean类的getter方法?

时间:2017-04-17 10:12:12

标签: java reflection javabeans

如果我使用Reflection API实例化类,为什么variable2的值为null?

其中,Variable1的值按照集合正确返回,这里我正常实例化对象。 如何使用variable2获取ReflectionAPI的值?

    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
      }
    }

输出: 内存 空

2 个答案:

答案 0 :(得分:0)

这是因为您在新创建的对象(例如obj)上调用该方法,该方法没有为variable1variable2设置值,例如:

Object obj = newClass.newInstance();

以上内容将创建ObjectBean个新类variable1variable2的空值。如果要打印beanobject方法中设置的值,则需要使用beanobject调用getter方法。即改变

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

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

答案 1 :(得分: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
}