本文共 2418 字,大约阅读时间需要 8 分钟。
package com.weiday12_1.www;import java.beans.BeanInfo;import java.beans.IntrospectionException;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.Map;import org.apache.commons.beanutils.BeanUtils;import org.apache.commons.collections.map.HashedMap;import bean.Student;/** * 内省依赖反射,归根到底还是反射,只不过是对反射的一个包装,是用起来更加顺手。 * 值得说一下的是使用BeanUtils是必须导入Collections.jar * @author 74087 * */public class BeanInfoTest { public static void main(String[] args) throws Exception { Class clazz = Class.forName("bean.Student"); Object student = clazz.newInstance(); //useBookInfo(); //useBeanUtilsP(student); //useUtilsM(student); } public static void useUtilsM(Object student) throws IllegalAccessException, InvocationTargetException { //我们还可以使用map来进行赋值 Mapm = new HashedMap(); m.put("name","魏金浩"); m.put("num",23); BeanUtils.populate(student, m); System.out.println(student); } public static void useBeanUtilsP(Object student) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { BeanUtils.setProperty(student, "name", "魏金浩"); BeanUtils.setProperty(student, "num", "13"); String name = BeanUtils.getProperty(student,"name"); String num = BeanUtils.getProperty(student, "num"); System.out.println("name=" + name + "num=" + num); } public static void useBookInfo() throws ClassNotFoundException, InstantiationException, IllegalAccessException, IntrospectionException, InvocationTargetException { Class cs = Class.forName("bean.Student"); Student s = (Student)cs.newInstance(); BeanInfo bi = Introspector.getBeanInfo(cs); PropertyDescriptor[] pd = bi.getPropertyDescriptors(); //我们实际的到的数组中有三个PropertyDescriptor对象,从第二个开始是我们的属性描述 if(pd != null) { Method mt1 =pd[1].getWriteMethod(); System.out.println(pd[1].getName());//这里我们可以来自己实现方法达到灵活设置属性和得到属性,但是我们不用这摸麻烦应为commons组件已经为我们实现了 System.out.println(pd[1].getPropertyType()); Method mt2 = pd[2].getWriteMethod(); System.out.println(pd[2].getName()); System.out.println(pd[2].getPropertyType()); if(mt1 != null){ mt1.invoke(s, "魏金浩"); } if(mt2 != null){ mt2.invoke(s, 23); } } System.out.println("name=" + s.getName() + "num=" + s.getNum()); }}
这里最主要的是BeanInfo这个接口,我们可以实现它来达到早作bean的目的,但是这样工作量过于大了,所以我们使用Introspector类的静态方法得到关于该类的BeanInfo对象。该方法在 Java Bean 上进行内省,了解其所有属性、公开的方法和事件。
转载地址:http://quelf.baihongyu.com/