------- android培训、java培训、期待与您交流! ----------
一、反射
对于反射,曾经有一个传智播客的学长对它有一个很精辟的总结,那就是:反射就是把Java类中的各种成份映射成对应的java类。
我不能在同意更多,我的理解也是如此,把java类中的各个变量与方法名映射为一个一个的类,来让我们使用。
二、内省
现在在说一下内省。说到内省,就不得不先说一下javabean。什么是javabean?根据百度百科的专业回答是这样的:“JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。众所周知,属性名称符合这种模式,其他Java 类可以通过自省机制发现和操作这些JavaBean 的属性。“
我认为这样的概述比较啰嗦,不容易被理解。其实javabean的含义很简单。在我看完张孝祥老师的视频后的理解就是只要一个类中有set和get方法,那么这个类就符合javabean的规则,它就是一个javabean。我们可以把这个类当做javabean来处理,也可以不当做javabean来处理。并且一个类是否是javabean与它的成员变量无关。
说完javabean我们接着说一下内省。开始接触内省时,我一度无法区分内省与反射的区别。因为我的主观意识认为,它们两个是一会儿事儿,都是通过字节码文件来获取类中的内容。在我查阅了一些资料后才发现它们的区别。其实很简单,我的总结就是:内省就是针对操作javabean而存在的一个手段,我的理解就是反射>内省。而内省在操作javabean时要比反射方便。所以我要在说内省之前先说一下javabean。
三、分别用反射与内省的手段获取一个类中的get\set方法。
例:有一个Person类,该类有成员变量int x。并有getX\setX方法,也有对应的构造函数。
用反射的方式获取:
<span style="white-space:pre"> {
Person p = new Person(3); //建立对象
Class clazz = p.getClass(); //获取字节码文件
Method getM = clazz.getMethod("getX"); //获取get方法
Object retVa1 = getM.invok(p); <span style="white-space:pre"> //执行get方法获取返回值,因为不知道是什么类型所以用Object接收
}
用内省的方式获取:
class IntroSpectorTest
{
Person p = new Person(3);
String propertyName="x"; //把想要得到的javabean中的属性赋给一个变量
PropertyDescriptor pd = new PropertyDescriptor(propertyName,p.getClass()); //声明属性描述对象
Method getM = pd.getReaderMethod(); //获取get方法
Object retVa1 = getM.invoke(); //获取返回值
}
表面看上去是反射的方式更简单一些,其实不是。因为有可能你想要获取的成员变量是私有的,那么你只能靠猜的方法去获取方法名:"x"-->"X"-->"getX"-->MethodGetX.
而内省则不同不用写方法名就可以获得get方法。所以在操作javabean的时候最好使用内省的方式。