标签:
一、什么是类型信息?
简单的理解 ,“类型信息”就是一种机制, java中用这种机制来实现: 在程序运行过程中发现和使用“类”信息。
java的类型信息主要有两块组成:RTTI和反射。
二、什么是RTTI?
RTTI,全称是Run-Time Type Information ,名字的含义是在运行时识别一个对象的类型。
1.Class对象
java中用一个特殊的对象Class, 通过它来执行其RTTI(这是一种思想, 用一个Class来表示所有类型对象,通过具体的Class里面的属性再来区分到底是哪种类型, 类似的思想也用在spring中,spring里面的所有bean都是由BeanDefinition来表示的)。
所有类都是在其第一次使用时,动态加载到JVM中, 类加载器首先检查这个类的Class对象是否已经被加载,如果尚未被加载,默认的类加载器就会根据类名查找.class文件; 一旦某个类的Class对象被载入JVM, 它就被用来创建这个类的所有对象。
来看两个例子理解下载入的过程:
1 public class ClassTest { 2 static { 3 System.out.println("ClassTest"); 4 } 5 public static void main(String[]args) { 6 7 } 8 } 9 10 class Candy { 11 static { 12 System.out.println("Candy"); 13 } 14 }
结果如下:
ClassTest类中, 执行main方法时,会自动加载ClassTest类, 这个类里面有静态方法块static, 所以会显示ClassTest;
而Candy类中, 由于一直没有用到其元素, 所以并不会加载Candy的类。
再看:
1 public class ClassTest { 2 public static void main(String[]args) { 3 System.out.println(Candy.i); 4 } 5 } 6 7 class Candy { 8 public static final int i= 1;//定义一个常量 9 10 static { 11 System.out.println("Candy"); 12 } 13 }
结果如下:
这个例子中,常量是在编译期间就确定的,所以main函数中调用Candy.i ,实际上并不需要加载ClassTest的类型信息, 因此并没有执行static静态块中的语句。
2.类的字面量
1 public class ClassTest { 2 public static void main(String[]args) { 3 System.out.println(Boolean.TYPE); 4 System.out.println(Boolean.class); 5 System.out.println(boolean.class); 6 7 } 8 }
结果如下:
标签:
原文地址:http://www.cnblogs.com/kaiguoguo/p/4784217.html