该类不在类路径中而不在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 但没有得到解决方案。
那么我做错了什么? (为什么我能看到“示例注释”)? 感谢
答案 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 {
}