您的位置:首页 > 编程语言 > Java开发

java 类型信息(RTTI) 中 Class对象的理解

2015-12-21 17:33 531 查看
java 类型信息(RTTI) 中 Class对象的理解
要理解RTTI 在java中的工作原理,首先必须知道类型信息在运行时是如何表示的,这项工作是由称为Class 对象的特殊对象完成的,它包含了与类有关的信息,事实上,Class对象就是用来创建类的所有的“常规”对象的的,JAVA使用Class对象来执行其RTTI,即使你正在执行的是类似转型的操作,Class类还拥有大量的使用RTTI的其他方式。

类是程序的一部分,每个类都有一个Class对象,换言之,每当编写并且编译了一个新类,就会产生一个Class对象(更恰当的说,是被保存在一个同名的。class文件中)

为了生成这个类的对象,运行这个程序的java虚拟机(JVM)将使用被称为类加载器的子系统。

类加载器子系统实际上可以包含一条类加载器链,但是只有一个原生类加载器,它是JVM实现的一部分,原声类加载器加载的是所谓的可信类,它包括JAVA API 类,他们通

常是从本地盘中加载的,这条不需要额外的类加载器d,除非有特殊需求。

所有的类都是在对其第一次使用的时候,动态的加载到JVM当中的,当程序创建第一个对类的静态成员引用的时候,就会加载这个类,这个证明构造器也是类的静态方法,即

使在构造器之前并没有使用static关键字,因此,使用New操作符创建类的新对象也会被当做对类的静态成员的引用。

因此,java程序在它开始运行的之前并非完全加载,其各个部分是在必须时才加载的,这个与许多的传统语言不

一样,动态加载使能的行为,在诸多的c++这样的静态加载语言中是很难或者根本不可能复制的

类加载器首先检查这个类的Class对象是否已经加载,如果尚未加载,默认的类加载器就会根据类名查找.class

文件。在这个类的字节码被加载时,他们会接受验证,以确保其没有被破坏。并且不包含不良代码

取得类引用的几种方式:

1)Class.forName(string s ) 这个方法是Class类(所有的对象都属于这个类)的一个static成员,该方法返回的是一个Class对象的引用。使用这个方法会产生一个副作用:如果类没有被加载就加载它,在加载的过程中,类的static子句会被执行。(如果没有找到类会抛出一个异常ClassNotFoundException)

2)getClass 如果你已经拥有了一个类型的对象,那就可以通过调用.getClass()方法来获取Class引用了,这个方法属于根类Object的一部分,它将返回表示该对象的实际类型的Class引用,Class包含很多有用的方法

3)类字面常量

类名.class 这样不简单,而且更安全,因为它在编译时就会受到检查,所以更高效不需要try.不仅仅可以应用于普通类,而且可以应用于接口数组,已经基本数据类型,另外,对于基本数据类型的包装类,还有一个标准字段TYPE。TYPE字段是一个引用,指向对应的基本数据类型的class

Class引用包含很多有用的方法,以下是其中的一部分。

.getName() isInterface() getSimpleName getCannonicalName()(获得完整名字)

getSupperClass() (获得父类的class引用) getInterfaces()获得接口引用)

class 的newInstance()方法是实现虚拟构造器的一种途径,虚拟构造器允许你声明,我不知道你的确切类型,但是无论如何要正确的创建你自己,

为了使用类Class而做的工作包含三个步骤:

1。加载。这是由类加载器执行的,该步骤将查找字节码并从这些字节码中生成一个Class对象。

2。 连接。在链接阶段将验证类中的字节码,为静态域分配存储空间,并且如果必须的话,将解析这个类创建的对其他类的所有引用。

3。初始化。如果该类具有超类,则对其初始化,执行静态初始化器和静态初始化块。

1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: