黑马程序员—浅谈反射与内省

------- 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的时候最好使用内省的方式。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值