通过自定义注解,在运行时为Bean字段赋值
创建自定义注解
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conf {
String value() default "";
}
未业务类配置注解
@Component
public class DemoBean {
@Conf(value = "id")
private String id;
@Conf("isOk")
private Object isOk;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Object getIsOk() {
return isOk;
}
public void setIsOk(Object isOk) {
this.isOk = isOk;
}
}
通过反射获取注解属性字段,并进行运行时赋值
public static Object getInstance() throws IllegalAccessException, InstantiationException {
Class<DemoBean> clz = DemoBean.class;
Object obj = clz.newInstance();
Field[] fields = clz.getDeclaredFields();
for (Field field : fields) {
boolean filedHasAnno = field.isAnnotationPresent(Conf.class);
if (filedHasAnno) {
field.setAccessible(true);
Conf annotation = field.getAnnotation(Conf.class);
Object value = annotation.value();
if (value.equals("id")) {
field.set(obj, "xxx");
} else if (value.equals("isOk")) {
field.set(obj, true);
}
}
}
return obj;
}
测试
DemoBean bean = (DemoBean) ConfUtil.getInstance();
System.out.println("id: " + bean.getId());
System.out.println("isOk: " + bean.getIsOk());
结果
id: xxx
isOk: true
文章来源:https://my.oschina.net/u/1000241/blog/1587276