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
要理解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
相关文章推荐
- 在myeclipse中错误java.lang.NoClassDefFoundError: javax/mail/Address的解决方法
- JAVA中List转换String,String转换List,Map转换S
- Java面向对象编程-第9章学习笔记
- eclipse代码中每行的开始和结尾出现多余的特殊符号
- java线程冲突问题——不安全的线程例子
- JAVA HashMap详细介绍和示例
- Spring中的ContextLoaderListener使用
- spring事务隔离级别
- JDK中的SimpleDateFormat线程非安全
- 关于Spring定时任务(定时器)用法
- 八大常见内排序java实现
- 使用javamail实现邮件发送功能完整代码
- eclipse连接mysql ping失败
- 给jdk写注释系列之jdk1.6容器(6)-HashSet源码解析&Map迭代器
- C# VS JAVA 差异 (未完待续)
- Java线程: 线程调度
- 深入Spring IOC源码之ResourceLoader
- java学习笔记-equals
- Java 泛型类型的一些限制
- java设计模式----观察者模式