智能注释

时间:2010-01-03 14:32:27

标签: java reflection annotations

我已经在我的生活中创建了许多注释,现在出现了一个奇怪的情况,我需要这个注释,并且根本不认为Java支持它。请有人告诉我,我是对还是错。

这是我的注释:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface DetailsField {
    public String name();
}

现在问题了!我希望名称()函数的默认值是我自己发布注释的字段的名称。

不确切知道类加载器如何处理注释,我很确定这不是在标准类加载器中实现的,但是可以通过自定义类加载器加载类时的字节码检测来实现? (我很确定这是否是我能找到解决办法的唯一方法,只是好奇)

有什么想法吗?或者我是否想要太多?

1 个答案:

答案 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"
  }
}