2013-07-30 176 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()