Java如何在加载类时检查注释类型

时间:2014-11-26 19:26:33

标签: java reflection annotations

  • 我想加载类(使用运行时注释),并检查注释的类型。
  • 注释与字段相关。
  • 该类不在类路径中而不在eclipse项目中

    • 对于这个问题,我需要用它的注释类来编译类。
  • 我使用以下链接加载了课程:

http://www.java2s.com/Tutorial/Java/0125__Reflection/URLclassloader.htm

加载课程后,我试图为每个字段获取注释并检查注释类型:

Field[] fields = obj.getClass().getFields();
        for (Field field : fields) {
            Annotation[] ann = field.getAnnotations();
            for (Annotation annotation : ann) {
                if (annotation.equals(Example.class)) {
                    System.out.println("Example annotation");
                }
            }

        }

我希望看到打印“示例注释”,但我没有得到它。

test.class和Example.class具有以下java源代码:

public class Test
{
    @Example (size = 5)
    public int x;

    @Example (size = 3)
    public int y;
}

public @interface Example
{

    int size();

}

保存在不同分区上的2个类,我用javac编译它们(并且有2个.class文件)

我看了: 1. Java - loading annotated classes 但没有得到解决方案。

那么我做错了什么? (为什么我能看到“示例注释”)? 感谢

2 个答案:

答案 0 :(得分:0)

您正在将Annotation类型与Class类型进行比较。

尝试

Field[] fields = obj.getClass().getFields();
    for (Field field : fields) {
        Annotation[] ann = field.getAnnotations();
        for (Annotation annotation : ann) {
            if (annotation.class.equals(Example.class)) {
                System.out.println("Example annotation");
            }
        }

    }

或者,您可以使用instanceOf运算符:

if (annotation instanceOf package.Example) {
     System.out.println("Example annotation");
}

注意:不在本地进行测试,只需阅读。

答案 1 :(得分:0)

使用

 if (annotation.annotationType().equals(Example.class)) {
        System.out.println("Example annotation");
 }

<强>更新

以下测试通过:

package annotation.test;

import org.junit.Test;

import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import junit.framework.Assert;

public class AnnotationTest {

    @Test
    public void TestAnnotationType() {
        Object obj = new ClassWithAnnotation();

        List<String> fieldList = new ArrayList<String>();

        // need to use declared fields as some are private
        Field[] fields = obj.getClass().getDeclaredFields(); 
        for (Field field : fields) {
            field.setAccessible(true);
            System.out.println("processing field " + field);
            Annotation[] ann = field.getAnnotations();
            for (Annotation annotation : ann) {
                if (annotation.annotationType().equals(Example1.class)) {
                    System.out.println(field);
                    fieldList.add(field.getName());
                }
            }
        }

        Assert.assertTrue(fieldList.contains("string1"));
        Assert.assertTrue(fieldList.contains("string2"));
        Assert.assertFalse(fieldList.contains("string3"));
        Assert.assertFalse(fieldList.contains("string4"));
        Assert.assertFalse(fieldList.contains("string5"));
    }
}

class ClassWithAnnotation {

    @Example1
    private String string1;

    @Example1
    public String string2;

    @Example2
    private String string3;

    private String string4;
    private String string5;

}

@Retention(RetentionPolicy.RUNTIME)
@interface Example1 {

}

@Retention(RetentionPolicy.RUNTIME)
@interface Example2 {

}