我已经在我的生活中创建了许多注释,现在出现了一个奇怪的情况,我需要这个注释,并且根本不认为Java支持它。请有人告诉我,我是对还是错。
这是我的注释:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface DetailsField {
public String name();
}
现在问题了!我希望名称()函数的默认值是我自己发布注释的字段的名称。
不确切知道类加载器如何处理注释,我很确定这不是在标准类加载器中实现的,但是可以通过自定义类加载器加载类时的字节码检测来实现? (我很确定这是否是我能找到解决办法的唯一方法,只是好奇)
有什么想法吗?或者我是否想要太多?
答案 0 :(得分:4)
我认为可以检测字节码(在类加载时)以使其正常工作,但这似乎是一个非常复杂且可能不可移植的解决方案。
解决问题的最佳方法是使用名称计算逻辑创建一个类(使用Decorator设计模式)装饰注释的实例。
[编辑:在界面添加了name()定义]
package p1;
import java.lang.annotation.*;
import java.lang.reflect.*;
public class A {
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface DetailsField {
public int n1();
public String name() default "";
}
public static class Nameable implements DetailsField {
private final DetailsField df;
private final Field f;
public Nameable(Field f) {
this.f = f;
this.df = f.getAnnotation(DetailsField.class);
}
@Override
public Class<? extends Annotation> annotationType() {
return df.annotationType();
}
@Override
public String toString() {
return df.toString();
}
@Override
public int n1() {
return df.n1();
}
public String name() {
return f.getName();
}
}
public class B {
@DetailsField(n1=3)
public int someField;
}
public static void main(String[] args) throws Exception {
Field f = B.class.getField("someField");
Nameable n = new Nameable(f);
System.out.println(n.name()); // output: "someField"
System.out.println(n.n1()); // output: "3"
}
}