从带注释的字段接收注释值
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
。
没有直接的方法来实现您的要求。
解决方法:
限制:
- 此解决方法不强制执行任何类型的编译时检查,您完全有责任处理它。
- 这仅在 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 上使用。
是否可以在已注释的字段中接收注释值? 想象一下我有这个界面:
@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
。
没有直接的方法来实现您的要求。
解决方法:
限制:
- 此解决方法不强制执行任何类型的编译时检查,您完全有责任处理它。
- 这仅在 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 上使用。