Java RTTI与反射

来源:互联网 发布:linux fat挂载移动硬盘 编辑:程序博客网 时间:2024/06/04 20:51

       首先,Java RTTI与反射,搜了很多资料,结论是,这名字本身就很sb,这俩东西很难说清楚区别又不完全一样(好吧,反正只能先这么记了)。

       按照大多数程序员比较能接受的概念,运行时类型识别(RTTI, Run-Time Type Identification)指的是Java在运行时能够获得或判断某个对象的类型信息,这东西是C++中的一个概念,由《Think in Java》的作者薅过来的,起因是因为这大神写过一本《Think in C++》反响还不错。反射的核心是JVM在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。反射的精髓在于运行时,三个字,只不过RTTI的关键在于类型识别。

       RTTI是一种机制,Java中多态就是由该机制实现的,该机制的实现主要依赖Class类。具体实现是,Java中每个类,都会有一个与之对应的Class类的对象,可以通过 类名称.class或者 普通对象的getClass()方法获取类型对应的Class类对象。

获取某一个类的Class类对象的三种办法:

       1.类名称.class

       2.对象.getClass()

       3.Class class = Class.forName("类名称");

       获取到目标类对应的Class类对象class之后,可以使用class.newInstance()生成目标类的实例,并且可以用class的几个对应的方法获知目标类的方法,构造函数,全局变量。

       看下面一段代码:

        Human aPerson = new Human();        Class c1      = aPerson.getClass();        System.out.println(c1.getName());        Human anotherPerson = new Woman();//Woman类型的对象  向上转型Human        Class c2      = anotherPerson.getClass();        System.out.println(c2.getName());  
       在c2中,即使我们将Women对象的引用向上转换为Human对象的引用,对象所指向的Class类对象依然是Woman。

       Java中每个对象在生成的时候都有相应的Class类对象引用,可以用getClass()方法访问。因此,我们随时能通过Class对象知道某个对象“真正”所属的类。无论我们对引用进行怎样的类型转换,对象本身所对应的Class对象都是同一个。当我们通过某个引用调用方法时,Java总能找到正确的Class类中所定义的方法,并执行该Class类中的代码。由于Class对象的存在,Java不会因为类型的向上转换而迷失。这就是多态的原理。

       

      Java反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。 反射的核心是JVM在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。


Java反射框架主要提供以下功能:

1.在运行时判断任意一个对象所属的类;

2.在运行时构造任意一个类的对象;

3.在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法);

4.在运行时调用任意一个对象的方法


       运行时动态加载类:在编译期间并不知道某一具体类的存在,运行时遇到了,就根据类的名称利用反射机制获取该类的Class类对象,利用类的Class类对象生成目标类的事例。



参考文章:

      http://www.cnblogs.com/vamei/archive/2013/04/14/3013985.html

      http://www.sczyh30.com/posts/Java/java-reflection-1/

      http://www.importnew.com/23560.html

原创粉丝点击