无法访问Java中的字段注释

时间:2014-03-27 10:27:15

标签: java reflection annotations

我有注释

public @interface Equals {
String name() default "unknown";
}

和其字段由Equals

注释的类
public class TransportSearch {
@Equals(name="vin")
public String vin = null;
}

我在另一个类中有一个方法

public String (TransportSearch transportSearch){
    Field[] fields = transportSearch.getClass().getDeclaredFields();

    String vin = null;

    for(Field field : fields){
        try {
            Equals annot = field.getAnnotation(Equals.class);

            if(annot!=null && annot.name().equals("vin")){
                try {
                    vin = (String) field.get(transportSearch);
                } catch (IllegalAccessException e){
                    e.printStackTrace();
                }
            }

        } catch(NullPointerException e) {
            e.printStackTrace();
        }
    }
    return vin;
}

遗憾的是,在这个方法中,field.getAnnotation(Equals.class)返回null,我无法理解为什么? 你能救我吗?

2 个答案:

答案 0 :(得分:4)

您必须将注释的RetentionPolicy设置为RetentionPolicy.RUNTIME

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Equals {
    String name() default "unknown";
}

默认RetentionPolicyRetentionPolicy.CLASS,这意味着注释不需要在运行时可用。

答案 1 :(得分:-1)

如果您使用Kotlin:

class TransportSearch {
  @field:Equals(name = "vin")
  var vin:String? = null
}