无法通过ReflectionUtils.setField设置字段值

时间:2015-07-03 11:15:05

标签: java spring annotations

我正在创建一个自定义注释,它从特定间隔(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();
}

1 个答案:

答案 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}}