使用java注释和反射获取java.lang.NullPointerException

使用java注释和反射获取java.lang.NullPointerException,java,reflection,nullpointerexception,annotations,Java,Reflection,Nullpointerexception,Annotations,我写了三个类“PrintDevice,Printer,Test”,如下所示 首先是PrintDevice.java public @interface PrintDevice{ String defaultPrint(); int defaultNumber(); } 第二,Printer.java @PrintDevice(defaultPrint="print",defaultNumber=5) public class Printer{ public Printe

我写了三个类“PrintDevice,Printer,Test”,如下所示

首先是PrintDevice.java

public @interface PrintDevice{
    String defaultPrint();
    int defaultNumber();
}
第二,Printer.java

@PrintDevice(defaultPrint="print",defaultNumber=5)
public class Printer{
    public Printer(){
        //empty Construcutor
    }
    @PrintDevice(defaultPrint="print",defaultNumber=5)
    public void print(int number){
        System.out.println(number);
    }
}
第三,Test.java

import java.lang.reflect.*;
public class Test{
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException{
        Printer printer = new Printer();
        PrintDevice anno = printer.getClass().getAnnotation(PrintDevice.class);
        Method m = printer.getClass().getMethod(anno.defaultPrint(),int.class);
        m.invoke(printer,anno.defaultNumber());
    }
}
编译它们时没有任何问题,但是当我尝试运行Test.java时,我得到了NullPointerExcetion,如下所示:-

线程“main”java.lang.NullPointerException中出现异常 at Test.main(Test.java:7)


您需要具有运行时保留策略的
@Retention

@Retention(RetentionPolicy.RUNTIME)
public @interface PrintDevice{
    String defaultPrint();
    int defaultNumber();
}

否则,批注在运行时不可用。

您需要使用运行时保留策略的
@Retention

@Retention(RetentionPolicy.RUNTIME)
public @interface PrintDevice{
    String defaultPrint();
    int defaultNumber();
}

否则,批注在运行时不可用。

@OsamaElsayed您可能还希望向批注添加
@Target
批注,以限制批注的应用位置。@OsamaElsayed您可能还希望向批注添加
@Target
批注,以限制批注的应用位置。