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; }}