java - 通过反射获取java注解信息

标签 java reflection annotations

我有这个注释类型类:

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 注释,但我无法获得有关哪些字段具有注释以及哪些值具有这些字段的信息,例如:

字段端口 - 值 444

有什么方法可以通过反射获取这些信息吗?

谢谢

最佳答案

你可以调用:

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
       ..
    }
 }

关于java - 通过反射获取java注解信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17943143/

相关文章:

java - 在 Eclipse 上调试 CGLIB FastClass 时出错

java - java中使用泛型类型代替反射来创建实例

java - Tomcat 服务器找不到 DigestUtils apache 类

java - Stripe - 连接到独立帐户

java - 葫芦-android : Touch fails due to "No elements found" but element was found

reflection - 反射(reflect)类型参数

hibernate - 如何让 Hibernate 在它创建的表/字段上添加注释

java - Autowiring 集合

java - 需要了解阔叶商务自定义注释实现

java - 在计算器中按取消按钮 'C' 后出现错误(Eclipse IDE 和 swings)