Java RTTI

来源:互联网 发布:美国日本关系知乎 编辑:程序博客网 时间:2024/05/17 01:36

Java RTTI的思维导图:



RTTI(runtime type info)用于在运行时识别对象的类型信息。java虚拟机不能在运行时加载所有类型对象(动态加载),同时部分类型的信息是无法再编译器就获取的,需要在业务逻辑中依据类型信息进行相关逻辑的处理,这是就需要RTTIl了。

众所周知,java类在编写时会生成.class文件,那.class文件时如何使用的呢?在创建java类对应对象时,jvm虚拟机的classLoader会检测对象对应的Class对象是否已加载,如果没有加载则会依据相关途径查询对应.class文件(如 通过classPath在本地文件系统进行查找),在获取到.class文件之后会对文件进行有效验证,之后会依据Class对象进行详细类型对象的创建。使用Class.forName方法、应用类的static变量、使用构造方法创建对象时,都会对class进行加载。

使用Class的newInstance方法可以创建class对应对象,但前提是对应类有默认构造函数(无参构造函数)。

xxx.class被称为类字面常量,是对Class对象的引用,但使用".class"获取对Class对象的引用,并不会立即初始化Class对象,为初始化Class对象,需要经过三个步骤:

1)加载:由classloader查找class字节码文件,并创建Class对象。

2)链接:验证字节码文件,为静态分配存储空间,解析对其他对象的引用;

3)初始化:初始化父类,执行静态初始化器和静态是初始化快。

final static成员和static成员的在以上三个过程中就不一样,final static成员被称为“编译器常量”,在编译时已经被赋值,所以可以在类加载前就进行访问,而静态成员(非final)需要在类加载后、class对象初始化之后赋值。

 

java内存为堆(heap)、方法区域(method area)、java栈(java stack)、程序计数注册器(program counter register)、本地方法栈(native method stack)。对象的类型信息就存储在method area中,且不会有垃圾回收器进行垃圾回收。因此,如果设置的method area区域较少时,就回出现内存溢出问题(对象的error message是: java.lang.OutOfMemoryError: PermGen space),对应的JVM设置参数是:-xx:MaxPermSize=512m。


0 0