黑马程序员-反射总结

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------


反射
在正常情况下,必须知道一个类的完整路径之后才可以实例化对象,但是在java中也允许通过一个对象找到其所在的类的信息,那么着实际上就是Class类的功能。
Object类的支持
在object类中定义了“public final Class getClass()”的方法,此方法将被所有子类继承,它返回的是一个Class类,实际上此类是java反射的源头,

实际上所谓反射从程序的运行结果来看也很好理解,就是:可以通过对象反射求出类的名称:
正常:

      引入需要的“包.类”名称——>通过new实例化——>取得实例化对象

反射:         

      实例化对象——>getClass()方法——>得到完整的“包.类”名称

Class类
Class本身表示一个类的本身,通过Class可以完整的得到一个类中的完整结构,包括此类中的方法定义,属性定义等。查看JDK文档中我们可以发现没有任何的构造方法,所以此类的构造方法被私有化了。我们可以同过三种方式实例化Class类:
1. 通过forName()方法;
2. 类.class
3. 对象.getClass();
这三个语句返回的是同一个Class对象,这说明每个Class对象对应的是该Class对象的类的字节码。

也就是说程序中无论通过什么样的方式得到同样类的Class对象都是同一个对象。

那java虚拟机是如何做到这一点的呢?由于forName,和getClass方法都是native的,而java编译器在编译 类名.class语句时只是将常量池中所对应的表项压入栈顶而已。

我们无法得知其实现细节,究竟java虚拟机是在加载类的过程中就创建了该类的Class对象。

还是执行到上面的语句时才会创建Class对象。 反射就是将java类的元素映射成java类。Class类就是对所有java类的统一描述。类中的方法,字段,构造方法分别由Method,Filed,Constructor描述。

为什么会把构造方法和其他方法分开呢,其实在java虚拟机中,对象的构造和初始化是分开的。但在java语言中把这个系列动作统一成一个动作。就是说创建对象时必须由某个构造函数对其进行初始化。 虽然同一个类的Class对象都是相等的,但是通过对象获得的Method,Field,Constructor都是不等的。

内省:
内省是java反射的一个应用。它假定java类满足某种规则,并且根据这种规则来推断java类中的字段,构造方法,以及方法。

并用java反射对其进行操作,可以通过配置文件的信息的信息,这样可以程序变得很灵活。

最典型的例子就是对javabean进行内省,一个满足javabean规范的java类就是一个javabean。

例如javabean必须为每个字段定义getter和setter方法,并且提供无参的构造函数。

在很多框架中都有这样的应用,比如在hibernate中,hibernate-hbm.xml映射文件中配置的java类就必须满足这些条件。

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值