2013-07-30 238 views
3

獲取有關在Java中的註釋信息,我有這樣的註釋類型類:通過反射

import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 

@Retention(RetentionPolicy.RUNTIME) 
public @interface RemoteTcpAccess { 

    public int port(); 
} 

並將其應用在另一個類是這樣的:

@RemoteTcpAccess(port = 444) 
public class CalculatorService { 

    public int Add(int a, int b) { 
     return a + b; 
    } 

    public void DisplayText(String text) { 
     System.out.println(text); 
    } 
} 

現在,我得到了CalculatorService的類對象,並嘗試獲取有關RemoteTcpAccess註釋的信息:

private static void CheckRemoteTcpAccess(List<Class> classes) { 
     for (Class class1 : classes) { 
      for (Annotation annotation : class1.getDeclaredAnnotations()) { 
       if (AnnotationEquals(annotation, ComponentsProtocol.REMOTE_TCP_ACCESS)) { 
      //GET INFORMATION 
       } 
      } 
     } 
    } 

    private static boolean AnnotationEquals(Annotation classAnnotation, String protocolAnnotation) { 
     return classAnnotation.toString() 
       .substring(0, classAnnotation.toString().indexOf("(")) 
       .equals(protocolAnnotation); 
    } 

我能夠識別如果該類已經在其上應用RemoteTcpAccess註釋,但我不能得到什麼領域有註釋和inforamtion什麼樣的價值觀有那些領域,如:

場口 - 價值444

有什麼辦法如何獲得那些通過反思的信息?

感謝

回答

0

代碼應鍵入檢查註釋看看是否是RemoteTcpAccess。如果是這樣,請將Annotation轉換爲RemoteTcpAccess類型。從這種類型可以檢索到port

import java.lang.annotation.Annotation; 

@RemoteTcpAccess(port = 322) 
public class AnnotationTest { 

    /** 
    * @param args 
    * @throws NoSuchFieldException 
    * @throws SecurityException 
    */ 
    public static void main(String[] args) throws SecurityException, 
      NoSuchFieldException { 
     Annotation anno = AnnotationTest.class 
       .getAnnotation(RemoteTcpAccess.class); 
     if (anno instanceof RemoteTcpAccess) { 
      RemoteTcpAccess rta = (RemoteTcpAccess) anno; 
      System.out.println(rta.port()); 
     } 
    } 
} 
+0

非常有用,我會檢查instanceof關鍵字!但不是永遠instanceof RemoteTcpAccess嗎? –

+1

@JohnSmith在這個例子中是的,但想想你的情況(通過註釋循環)。如果該類有多個註釋,則它們可能不是「RemoteTcpAccess」類型。如果您盲目地執行投射並且稍後課程獲得註解,則代碼將會中斷。 –

1

試試這個

((RemoteTcpAccess)annotation).port(); 
+0

簡單和工作:)謝謝 –

2

您可以撥打:

RemoteTcpAccess rta = clazz.getAnnotation(RemoteTcpAccess.class); 
if(rta != null) //annotation present at class level 
{ 
int port = rta.port(); 
} 

在你的情況,你可以直接使用特定的註解(RemoteTcpAccess)而不是使用Annotation的通用方法。因此,這將削減下來的環路:

for (Class class1 : classes) { 
    RemoteTcpAccess rta = class1.getAnnotation(RemoteTcpAccess.class); 
    if(rta != null) { 
     int port = rta.port(); //GET INFORMATION 
     .. 
    } 
} 
0

從寂寂接口和註釋之間的ananlogy,我會說,這會工作:

((RemoteTcpAccess) annotation).getPort()