JavaBean的内省操作 跟反射差不多 ,只是内省操作比反射简单,但是原理都一样, 学会了JavaBean的内省操作 那么对于JavaBean在web中的应用就会有很好的理解,并且明白为什么利用动作指令setProperty就可以设置JavaBean的属性 :
看下面代码 ,有注释。
假设我们有一个JavaBean
package me.test;
public class IntroSpectorTest
{
private int x ;
public IntroSpectorTest(int x)
{
this.x=x ;
}
public int getX()
{
return x ;
}
public void setX(int x)
{
this.x=x ;
}
}
1、这是对 JavaBean的内省操作(这个只是我自己写的代码
package me.test;
import java.lang.reflect.*;
import java.beans.PropertyDescriptor;
public class JavaBeanTest {
public static void main(String[] args) throws Exception
{
IntroSpectorTest t=new IntroSpectorTest(3) ; //创建一个JavaBean对象
String propertyName="x"; //我们对x属性进行内省操作,定义个String类 保存属性名字
PropertyDescriptor pt1=new PropertyDescriptor(propertyName,IntroSpectorTest.class) ; //创建一个 属性描述符类 PropertyDescriptor类 参数是 属性名字和 JavaBean类的字节码
Method m1=pt1.getReadMethod() ; //获得设置方法的映射类其实跟反射差不多,通过属性描述符返回 Method对象 ,这个对象是 getX()方法的映射对象
Object obj=m1.invoke(t); //调用t对象的getX方法,并返回结果 ,结果自动装箱
System.out.println(obj); //打印结果
PropertyDescriptor pt2=new PropertyDescriptor(propertyName,IntroSpectorTest.class); //创建属性描述类
Method m2=pt2.getWriteMethod() ;//获得设置方法 对应的映射对象
m2.invoke(t, 7); //执行 t对象的setX方法
System.out.println(t.getX()); //打印结果
}
}
2、下面是通过Eclipse提供的 Refactor ->Extract Method 提取方法 得到的代码
package me.test;
import java.lang.reflect.*;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
public class JavaBeanTest {
public static void main(String[] args) throws Exception
{
IntroSpectorTest t=new IntroSpectorTest(3) ;
String propertyName="x";
Object obj = getProperty(t, propertyName); //看看像不像jsp动作指令中的 setProperty 。。。。这就是JavaBean内省操作
System.out.println(obj);
setProperty(t, propertyName); //看看像不像jsp动作指令中的 setProperty 。。。。这就是JavaBean内省操作
System.out.println(t.getX());
}
private static void setProperty(IntroSpectorTest t, String propertyName) //利用 Eclipse的Refactor自动为我们生成的方法
throws IntrospectionException, IllegalAccessException,
InvocationTargetException {
PropertyDescriptor pt2=new PropertyDescriptor(propertyName,IntroSpectorTest.class);
Method m2=pt2.getWriteMethod() ;//获得设置方法
m2.invoke(t, 7);
}
private static Object getProperty(IntroSpectorTest t, String propertyName) //利用 Eclipse的Refactor自动为我们生成的方法
throws IntrospectionException, IllegalAccessException,
InvocationTargetException {
PropertyDescriptor pt1=new PropertyDescriptor(propertyName,IntroSpectorTest.class) ;
Method m1=pt1.getReadMethod() ; //获得设置方法的映射类其实跟反射差不多
Object obj=m1.invoke(t);
return obj;
}
}