一、使用场景:
在一些项目框架中会利用java反射获取对象的属性,如果使用Map进行数据的存取,反射是无法取到对应的属性的。比如说我们查询表某些字段,查询的列和字段的类型都是非固定的,此时我们需要设计一个对象,且对象的属性是动态的,这样后期我们可以使用反射对该对象进行动态的属性赋值。
二、引入jar包
我们需要引入两个jar包,cglib.jar和asm.jar。需要注意的是:cglib2.2.jar和asm 4.0.jar是不兼容的。
三、源码:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import net.sf.cglib.beans.BeanCopier;
import net.sf.cglib.beans.BeanGenerator;
import net.sf.cglib.beans.BeanMap;
public class ClassUtil {
public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
//定义属性名
BeanGenerator beanGenerator = new BeanGenerator();
beanGenerator.addProperty("id", Long.class);
beanGenerator.addProperty("username", String.class);
//定义属性值,并自动创建get和set方法
Object obj = beanGenerator.create();
BeanMap beanMap = BeanMap.create(obj);
beanMap.put("id", 1234l);
beanMap.put("username", "zhangsan");
//创建类
Class clazz = obj.getClass();
Method[] methods = clazz.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
System.out.println("方法名:"+methods[i].getName());
if(methods[i].getName().startsWith("get")) {
System.out.println("方法名:"+methods[i].invoke(obj, args));
}
}
}
}
四、运行结果:
方法名:getId
运行结果:1234
方法名:getUsername
运行结果:zhangsan
方法名:getSex
运行结果:男
方法名:setId
方法名:setSex
方法名:setUsername