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来进行赋值
Map<String,Object> m = 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 上进行内省,了解其所有属性、公开的方法和事件。