Can';Java中字段的t-access注释

Can';Java中字段的t-access注释,java,reflection,annotations,Java,Reflection,Annotations,我有注解 public @interface Equals { String name() default "unknown"; } 和类,其字段由等号注释 public class TransportSearch { @Equals(name="vin") public String vin = null; } 我在另一个类中有一个方法 public String (TransportSearch transportSearch){ Field[] fields = transpo

我有注解

public @interface Equals {
String name() default "unknown";
}
和类,其字段由等号注释

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,我不明白为什么? 您能帮助我吗?

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

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

@Retention(RetentionPolicy.RUNTIME)
public @interface Equals {
    String name() default "unknown";
}
默认的
RetentionPolicy
RetentionPolicy.CLASS
,这意味着注释不需要在运行时可用。

如果使用kotlin:

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

更正很少:默认的RetentinPolicy是RetentionPolicy.CLASS。但这仍然是一个正确的答案。@SeelenVirtuse感谢您的更正-我编辑了我的答案以反映这一点。