从带注释的字段接收注释值

Receive annotation value from annotated field

是否可以在已注释的字段中接收注释值? 想象一下我有这个界面:

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

我有这样的实现:

class SomeClass {
    @MyAnnotation("Annotation")
    private MyClass myClass;
}

我想了解的是:是否可以在 MyClass 中接收 MyAnnotation 的值?我想在 class MyClass 中实现一个方法,它将 return 分配的注释值。因此,myClass.getAssignedAnnotationValue() 将 return "Annotation"。 如果不可以,请告诉我。

is it possible to know annotation value inside annotated field

这不可能。

您可能有 2 个不同的 类

class SomeClass {
    @MyAnnotation("Annotation")
    private MyClass myClass;
    public SomeClass(MyClass myClass) {
        this.myClass=myClass;
    }
}

class SomeClassNo Annotation {
    private MyClass myClass;
    public SomeClassNo(MyClass myClass) {
        this.myClass=myClass;
    }
}

然后创建 MyClass 的实例

MyClass 实例 = new MyClass();

然后 2 类 个实例 new SomeClass(instance)new SomeClassNo(instance) 都引用相同的 instance。所以实例不知道引用字段是否注解了。

唯一可能的情况是以某种方式将容器引用传递给 MyClass

没有直接的方法来实现您的要求。

解决方法:

限制:

  1. 此解决方法不强制执行任何类型的编译时检查,您完全有责任处理它。
  2. 这仅在 MyClass 将成为 spring bean 时有效。

class MyClass {
    public String annotatedValue;
}

你可以写一个Spring BeanPostProcessor 如下方式。

public class SampleBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
        throws BeansException {

        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)
        throws BeansException {

        Field[] fields = bean.getClass().getDeclaredFields();
        for (Field field : fields) {
            if (field instanceof MyClass && field.isAnnotationPresent(MyAnnotation.class)) {
                String value = field.getDeclaredAnnotation(MyAnnotation.class).value();
                ((MyClass) field).annotatedValue = value;
                return bean;
            }
        }
        return bean;
    }
}

上面的 BeanPostProcessor 将在应用程序启动期间为每个 bean 调用。它将检查给定 bean 的所有字段以查看该字段是否为 MyClass 类型。如果是,它将从注释中提取值并将其设置在 annotatedValue 字段中。

这种方法的问题是您可以在任何 class 中的任何 属性 上使用 MyAnnotation。 您不能强制注释仅在 MyClass 上使用。