通过反射的方式访问javabean的技术,我们可以去实现一种通用性。java中也有实现,不过一般不用,那几个类看上去有点繁琐,Jdk中有个api : PropertyDescriptor类,他可以操作Bean和Beaninfo的属性。
1.传统的方式去访问javabean
package linkin; public class LinkinTest { public static void main(String[] args) { Linkin linkin = new Linkin(); linkin.setName("LinkinPark..."); linkin.setAge(25); System.out.println(linkin); } } class Linkin { private String name; private Integer age; public Linkin() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Linkin [name=" + name + ", age=" + age + "]"; } }
2.使用内省的方式来访问javabean
package linkin; import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.lang.reflect.Method; public class LinkinTest { public static void main(String[] args) throws Exception { Linkin linkin = new Linkin(); //创建属性描述器 PropertyDescriptor descriptor = new PropertyDescriptor("name", Linkin.class); //获得写方法 Method writeMethod = descriptor.getWriteMethod(); //调用写方法 writeMethod.invoke(linkin, "LinkinPark..."); System.out.println(linkin); } } class Linkin { private String name; private Integer age; public Linkin() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Linkin [name=" + name + ", age=" + age + "]"; } }
3.简化书写,实现通用性。这里写一个通用的方法,让属性名称为一个变量,假如属性名很多的话,得到属性名后,就可以遍历,然后给他们一一的赋值,这就是内省的魅力。
如果不用反射,那么传统的方式是不可能实现通用的。
下面代码实现能够为任何的javabean赋任何的值,只有用内省的方法才可以做的到:
package linkin; import java.beans.PropertyDescriptor; import java.lang.reflect.Method; public class LinkinTest { public static void main(String[] args) throws Exception { Linkin linkin = new Linkin(); setProperty(linkin, "name", "LinkinPark..."); setProperty(linkin, "age", 25); System.out.println(linkin); } // 实现一个通用的方法 为任意的一个javabean的任意属性赋任意值 public static void setProperty(Object bean, String fieldName, Object value) throws Exception { // 创建属性描述器 PropertyDescriptor descriptor = new PropertyDescriptor(fieldName, bean.getClass()); // 获得 写方法 Method writeMethod = descriptor.getWriteMethod(); // 调用 写方法 writeMethod.invoke(bean, value); } } class Linkin { private String name; private Integer age; public Linkin() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Linkin [name=" + name + ", age=" + age + "]"; } }
setProperty(bean, name, value),我们在使用这个方法的时候不需要强制属性的类型,他会按照我们定义javabean的时候的类型帮我们放进去的,所以传入的是就传入字符串作为value就可以了。
使用这个方法我们可以将任何request提交的表单封装到对应的javabean。
先获得所有的参数:
Enumeration names = request.getParameterNames();
循环获得里面的每一个参数:
String value = request.getParameter(name);
传入一个类名,跑下反射,获得一个实例:
Object bean=beanClass.newInstance();
使用beanUtils将属性注入到对象中:
BeanUtils.setProperty(bean, name, value);
具体代码比较简单,这里就不贴了。
原文地址:http://blog.csdn.net/u011794238/article/details/42061101