反思不起作用

时间:2013-11-07 06:48:56

标签: java reflection

我很反思。我面临一些错误。请帮忙。以下是我的代码:

EmployeeClass.java:

public class EmployeeClass {

    private String empID;
    private String empName;

    public String getEmpID() {
        return empID;
    }

    public void setEmpID(String empID) {
        this.empID = empID;
    }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public EmployeeClass(String empID, String empName) { 
        this.empID = empID;
        this.empName = empName;
    }

    public String getAllDetails() {
        return empID + " " + empName;
    }

}

ReflectionClass.java:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ReflectionClass {

    public static void main(String[] args) {

        EmployeeClass emp = new EmployeeClass("1", "Emp1");
        Method method = null;
        try {
            method = emp.getClass().getMethod("getAllDetails", null);
            System.out.println(method.invoke(null, null));
        } catch (NoSuchMethodException | SecurityException
                | IllegalAccessException | IllegalArgumentException
                | InvocationTargetException e) {
            System.out.println(e.getMessage());
        }


    }

}

在运行ReflectionClass.java时,我收到以下错误:

线程“main”中的异常java.lang.NullPointerException

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
                at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
                at java.lang.reflect.Method.invoke(Unknown Source)
                at myprgs.programs.ReflectionClass.main(ReflectionClass.java:14)

3 个答案:

答案 0 :(得分:5)

您需要在调用invoke()时传递类的对象(包含您的方法),如下所示:

method.invoke(emp, null);

变化:

System.out.println(method.invoke(null, null));

要:

System.out.println(method.invoke(emp, null));

答案 1 :(得分:1)

 method = emp.getClass().getMethod("getAllDetails", null);
            System.out.println(method.invoke(null, null));

java.lang.reflect.Method.(Object obj, Object... args):第一个参数是要在其上调用此特定方法的对象实例。但是,第一个参数应为 null ,如果方法为 static 。因此,您需要使用emp的实例EmployeeClass调用:

System.out.println(method.invoke(emp, null));

args的第二个参数invoke() :(我假设我可能已经知道它),如果底层方法所需的形式参数的数量为0,则提供{{1}数组的长度可以是args0

答案 2 :(得分:0)

更改了main方法 - method.invoke需要employee对象。

public static void main(String [] args){

    Employee emp = new Employee("1", "Emp1");
    Method method = null;
    try {
        method = emp.getClass().getMethod("getAllDetails", null);
        System.out.println(method.invoke(emp, null));
    }
    catch (Exception e) {
        e.printStackTrace();
        System.out.println(e.getMessage());
    }
}