2014-01-16 2 views
0

я написал 3 класса "PrintDevice, принтер, Test", как следоватьПолучение java.lang.NullPointerException с Java аннотаций и отражения

Первое, 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 следующим образом: -

Исключение в потоке «основной» java.lang.NullPointerException на Test.main (Test.java:7)

ответ

5

Вы должны @Retention с политикой хранения времени выполнения

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

иначе аннотации не доступны во время выполнения.

+0

Точно, это работает, вы правы. – Scorpion

+0

@OsamaElsayed Вы также можете добавить аннотацию '@ Target' в аннотацию, чтобы ограничить использование аннотации. –

Смежные вопросы