Java的内省(introspector)

 java的反射技术,提供给了开发人员操作成员变量、成员方法和构造函数等等方法。很多时候,常常要用对象的属性来封装数据,反射技术完成这类操作过于繁琐,于是就有了内省的出现,它的作用,就是用来操作对象的属性的,大大减轻代码量。

内省就是操作javaBean的。下面来看一个User类的JavaBean

package Day01;

public class User {
	private String name;//字段,当有了get或者set方法之后就成为该类的属性,查看一个类的属性也就是看有几个get或者set方法。
	private String pass;
	private int age;
	//该类共有5个属性,这里隐含了一个继承自父类Object中的getClass()。
	public String getAb(){
		return "这也是一个属性";
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPass() {
		return pass;
	}
	public void setPass(String pass) {
		this.pass = pass;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	

}
IntrospectorTest类来操作User中的属性。

package Day01;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;

public class IntrospectorTest {

	public static void main(String[] args) throws Exception {
		 test1(); //内省的基本操作
		test2(); // 直接获取某个属性的属性描述器
	}

	// 内省的基本操作
	private static void test1() throws Exception {
		// 获取Bean信息的封装对象
		BeanInfo info = Introspector.getBeanInfo(User.class);
		// 下面的这个info不会拿到其继承下来的属性,这里即指Object中的class属性。
		// BeanInfo info = Introspector.getBeanInfo(Person.class,Object.class);
		// 得到所有的属性描述器
		PropertyDescriptor[] pds = info.getPropertyDescriptors();
		for (PropertyDescriptor p : pds) {
			// 通过属性描述器得到属性名
			System.out.println(p.getName());
			// 通过属性描述器得到属性类型
			System.out.println(p.getPropertyType());
		}
	}
	// 直接获取某个属性的属性描述器
	private static void test2() throws Exception {
		// 直接获取Person的name属性的属性描述器private String name;
		PropertyDescriptor pd = new PropertyDescriptor("name", User.class);//第一个参数是属性名,第二个参数是BeanClass
		// 由属性获得其setName()方法
		Method write = pd.getWriteMethod();
		User user = new User();
		// 用invoke执行方法
		write.invoke(user, "张三");//给user的name属性设置,相当于setName(String name)方法。
		// 获得getName()方法
		Method read = pd.getReadMethod();
		String name = (String) read.invoke(user, null);//相当于getName()方法。
		System.out.println(name);
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值