c/s角度看待JavaBean,及关于内省

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 上进行内省,了解其所有属性、公开的方法和事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值