2014-01-16 140 views
0

獲取顯示java.lang.NullPointerException我寫了3班 「的printdevice,打印機,測試」 爲遵循與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如下: -

異常線程「main」顯示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」註釋,以限制可以應用註釋的位置。 –