Java学习笔记-JavaBean-内省(Introspector)

-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

 

1.JavaBean的概念:特殊的Java类,符合某种规则。

JavaBean的规则:getXxx,setXxx 方法

2.内省的概念:(Introspector)Java语言对 JavaBean类属性的一种处理方法

3.PropertyDescriptor(属性描述器)

getReadMethod()获得应该用于读取属性值的方法。

getWriteMethod()  获得应该用于写入属性值的方法。

代码示例:

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

import Study.Person;

public class JavaBeanTest {
	public static void main(String[] args)throws Exception {
		Person p1 = new Person("zhansan",18);
		PropertyDescriptor pd = new PropertyDescriptor("name", p1.getClass());//创建属性描述器
		getValue(p1, pd);
		  
		Object value = 20;
		PropertyDescriptor pd1 = new PropertyDescriptor("age", p1.getClass());//创建属性描述器
		setValue(p1, value, pd1);
	}

	public static void setValue(Person p1, Object value, PropertyDescriptor pd1)throws Exception {
		Method setMethod = pd1.getWriteMethod();//通过属性描述器获取设置属性的方法
		setMethod.invoke(p1, value);//调用设置属性的方法,
		System.out.println(p1.getAge());//使用对象的方法输出设置后的值
	}

	public static void getValue(Object obj, PropertyDescriptor pd)throws Exception {
		Method getMethod = pd.getReadMethod();//通过属性描述器获取得到属性的方法
		Object retval = getMethod.invoke(obj);//调用设置属性的方法。
		System.out.println(retval);
	}
}

运行结果:
zhansan
20

通过JavaBean获取属性描述器:

Introspector-->getBeanInfo(Class beanClass) -->BeanInfo-->getPropertyDescriptors()
-->
getReadMethod
()getWriteMethod() -->Method-->invoke(Object obj,Object... args)

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

import Study.Person;

public class JavaBeanTest {
	public static void main(String[] args) throws Exception{
		Person p1 = new Person("lisi",30);
		BeanInfo beaninfo = Introspector.getBeanInfo(Person.class);//获取BeanInfo对象
		PropertyDescriptor [] pds = beaninfo.getPropertyDescriptors();//获取所有属性描述器,存入数组中
		for(PropertyDescriptor pd : pds){
			if(pd.getName().equals("name")){//判断属性的名字是否为name
				Method getNameMethod = pd.getReadMethod();//获取方法对象
				System.out.println(getNameMethod.invoke(p1));//调用指定对象上的该方法,并输出
			}
		}
	}
}


运行结果:

lisi

4.方法描述器(MethodDescriptor

Introspector-->getBeanInfo(Class beanClass) -->BeanInfo-->getMethodDescriptors()  
-->Method-->
invoke(Object obj,Object... args)

 代码示例:

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.MethodDescriptor;

import Study.Person;

public class JavaBeanTest {
	public static void main(String [] args)throws Exception{
		Person p = new Person();
		methodDescriptor(p);
	}
	public static void methodDescriptor(Object obj)throws Exception{
		BeanInfo objbeanifo = Introspector.getBeanInfo(obj.getClass());//获取BeanInfo对象
		MethodDescriptor [] methods = objbeanifo.getMethodDescriptors();//获取所有方法描述器,存入数组中
		for(MethodDescriptor method : methods){//遍历数组
			if(method.getName().equals("getAge")){//判断方法的名字
				System.out.println(method.getMethod().invoke(obj));//获取方法的对象并调用指定对象上的该方法,并输出
			}
		}
	}
}


 

运行结果:

0


5.BeanUtils工具包使用:

lib-->j将下载好的BeanUtils工具包拷贝到lib目录下-->右键build path-->add build path-->longging包同样的方法添加到库中。

 代码示例:

import org.apache.commons.beanutils.BeanUtils;

import Study.Person;

public class BeanUtilsTest {
	public static void main(String [] args)throws Exception{
		Person p1 = new Person();
		BeanUtils.setProperty(p1, "name", "zhansan");//使用BeanUtils工具包给p1对象属性赋值
		BeanUtils.setProperty(p1, "age", 25);
		System.out.println(BeanUtils.getProperty(p1, "name"));//使用BeanUtils工具包取出p1对象属性的值,并输出
		System.out.println(BeanUtils.getProperty(p1, "age"));
	}
}

运行结果:
 zhansan
25

-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

 

你可能感兴趣的:(Java学习笔记-JavaBean-内省(Introspector))