java 动态生成bean的案例
最近做一个需求,需求中的bean只用于生成一次json使用,所以想通过配置来动态的生成,查了一下,java还真有这个实现。
java动态的生成javabean,只能生成属性和对应的set/get方法,不能生成其他的方法。
importorg.assertj.core.internal.cglib.beans.BeanGenerator;
importorg.assertj.core.internal.cglib.beans.BeanMap;
importjava.lang.reflect.Field;
importjava.lang.reflect.Method;
importjava.util.HashMap;
importjava.util.Iterator;
importjava.util.Map;
importjava.util.Set;
/**
*Createdbywangpengzhi1on2018/1/2.
*/
publicclassBeanCeater{
publicstaticvoidmain(String[]args)throwsClassNotFoundException{
System.out.println("GenerateJavaBean");
Mapproperties=newHashMap();
properties.put("id",Class.forName("java.lang.Integer"));
properties.put("name",Class.forName("java.lang.String"));
properties.put("address",Class.forName("java.lang.String"));
Objectstu=generateObject(properties);
System.out.println("Setvalues");
setValue(stu,"id",123);
setValue(stu,"name","454");
setValue(stu,"address","789");
System.out.println("Getvalues");
System.out.println(">>"+getValue(stu,"id"));
System.out.println(">>"+getValue(stu,"name"));
System.out.println(">>"+getValue(stu,"address"));
System.out.println("Showallmethods");
Method[]methods=stu.getClass().getDeclaredMethods();
for(Methodmethod:methods){
System.out.println(">>"+method.getName());
}
System.out.println("Showallproperties");
Field[]fields=stu.getClass().getDeclaredFields();
for(Fieldfield:fields){
System.out.println(">>"+field.getName());
}
}
privatestaticObjectgenerateObject(Mapproperties){
BeanGeneratorgenerator=newBeanGenerator();
SetkeySet=properties.keySet();
for(Iteratori=keySet.iterator();i.hasNext();){
Stringkey=(String)i.next();
generator.addProperty(key,(Class)properties.get(key));
}
returngenerator.create();
}
privatestaticObjectgetValue(Objectobj,Stringproperty){
BeanMapbeanMap=BeanMap.create(obj);
returnbeanMap.get(property);
}
privatestaticvoidsetValue(Objectobj,Stringproperty,Objectvalue){
BeanMapbeanMap=BeanMap.create(obj);
beanMap.put(property,value);
}
}
代码不难懂,有需要的自己复制。
补充:spring工具类ReflectionUtils获取bean所有字段
以前遇到要获取当前类以及所有父类的的field的时候,都是递归一直往上找,一直到Object,个人觉得这种方法是不是太low了,有没有更好的办法?或者jdk其实是有这种方法的,只是我不知道,今天看了下spring中的实现,也是一样的,真没有更好的办法?
publicstaticvoiddoWithFields(Class>clazz,ReflectionUtils.FieldCallbackfc,@NullableReflectionUtils.FieldFilterff){
ClasstargetClass=clazz;
do{
Field[]fields=getDeclaredFields(targetClass);
Field[]var5=fields;
intvar6=fields.length;
for(intvar7=0;var7clazz){
Assert.notNull(clazz,"Classmustnotbenull");
Field[]result=(Field[])declaredFieldsCache.get(clazz);
if(result==null){
try{
result=clazz.getDeclaredFields();
declaredFieldsCache.put(clazz,result.length==0?NO_FIELDS:result);
}catch(Throwablevar3){
thrownewIllegalStateException("FailedtointrospectClass["+clazz.getName()+"]fromClassLoader["+clazz.getClassLoader()+"]",var3);
}
}
returnresult;
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。