java反射机制
java反射机制使我们可以在编码时动态的加载class、实例化对象、查看对象的所有信息(父类、接口、属性、方法等),并且可以动态设值。使我们的代码更加灵活,而不像常规的操作那样直接引用。但是这种方式性能会有所下降,尤其是在动态加载类时。
常用的反射方法
Class.forName(User.class.getName());
BeanUtilsDemo.class.getClassLoader().loadClass("User");
User.class.getClass();
new User().getClass();
都可以获取类的信息:
class.getAnnotations();
class.getConstructors();
class.getDeclaredFields();
class.getDeclaredMethods();
class.getMethods();
class.getFields();
实例化对象
class.newInstance();
java反射机制的应用很广泛,如:动态代理。
javaBean内省机制
通常反射的方式来访问javaBean的技术。
首先应明确javaBean,它是java的典型的POJO。即所有的属性都是private,并且都在对应的getter 和 setter方法,同时需要一个无参的构造器。
JDK的API:Introspector BeanInfo PropertyDescriptor
举例说明:
我们常规地对一个实例赋值是这样的:
User user = new User();
user.setId("1231");
user.setName("12131");
而通过内省机制是这样的:
User user = new User();
PropertyDescriptor descriptor = new PropertyDescriptor("id", user.getClass());
Method writeMethod = descriptor.getWriteMethod();
writeMethod.invoke(user, "1231");
或者
BeanInfo beanInfo = Introspector.getBeanInfo(user.getClass());
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
Method writeMethod = propertyDescriptors[0].getWriteMethod();
writeMethod.invoke(user, "1231");
那内省有什么好处呢?
内省的这种javaBean处理方式可以独立出来,对所有的javaBean都有用,而不需要指定它到底是哪个对象。
同时apache开发了一套操作javabean的API
核心类 BeanUtils
setProperty(bean, name, value)
copyProperties(target, source);
可以支持String到8中基本数据类型转换
其他引用数据类型都需要注册转换器 ConvertUtils.register(Converter, Class)
内省的使用案例
servlet提交表单时,可以动态的封装成对象。
参考地址:http://www.cnblogs.com/yejiurui/archive/2012/10/06/2712693.html
原文:http://881206524.blog.51cto.com/10315134/1908506