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; }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。