首页 > 编程语言 > 详细

java反射及javaBean内省机制

时间:2017-03-20 19:38:38      阅读:166      评论:0      收藏:0      [点我收藏+]

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






















java反射及javaBean内省机制

原文:http://881206524.blog.51cto.com/10315134/1908506

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!