我正在创建一个自定义注释,它从特定间隔(min,max)设置随机int数。
@GenerateRandomInt(min=2, max=7)
我已经实现了接口BeanPostProcessor
。这是它的实现:
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
Field[] fields=bean.getClass().getFields();
for (Field field : fields) {
GenerateRandomInt annotation = field.getAnnotation(GenerateRandomInt.class);
System.out.println(field.getName());
if(annotation!=null){
int min = annotation.min();
int max = annotation.max();
Random random = new Random();
int i = random.nextInt(max-min);
field.setAccessible(true);
System.out.println("Field name: "+field.getName()+" value to inject:"+i);
ReflectionUtils.setField(field,bean,i);
}
}
return bean;
}
这是spring context xml config:
<bean class="InjectRandomIntAnnotationBeanPostProcessor"/>
<bean class="Quotes" id="my_quote">
<property name="quote" value="Hello!"/>
</bean>
但是,当我测试程序时,所需字段的值为0(选中10次)。打印字段名称和要注入的值的代码行也不起作用。什么可能是错误?如何正确定义字段自定义注释?
PS
使用此注释的类:
public class Quotes implements Quoter {
@GenerateRandomInt(min=2, max=7)
private int timesToSayHello;
private String quote;
public String getQuote() {
return quote;
}
public void setQuote(String quote) {
this.quote = quote;
}
@Override
public void sayHello() {
System.out.println(timesToSayHello);
for (int i=0;i<timesToSayHello;i++) {
System.out.println("Hello");
}
}
}
描述注释的接口@GenerateRandomInt
@Retention(RetentionPolicy.RUNTIME)
public @interface GenerateRandomInt {
int min();
int max();
}
答案 0 :(得分:2)
而不是getFields
使用getDeclaredFields
。
第一个只会为您提供ReflectionUtils
个字段,后者会为您提供所有字段。
另一个提示:
由于您已经在使用ReflectionUtils.doWithFields(bean.getClass(),
new FieldCallback() {
public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
GenerateRandomInt annotation = field.getAnnotation(GenerateRandomInt.class);
int min = annotation.min();
int max = annotation.max();
int i = random.nextInt(max-min);
ReflectionUtils.makeAccessible(field);
ReflectionUtils.setField(bean, field, i);
}
},
new FieldFilter() {
public boolean matches(Field field) {
return field.getAnnotation(GenerateRandomInt.class) != null;
}
});
,因此建议您使用doWithFields
方法来简化代码。
{{1}}