运行时类型识别(RTTI, Run-Time Type Information)是Java中非常有用的机制,在java中,有两种RTTI的方式,一种是传统的,即假设在编译时已经知道了所有的类型;还有一种,是利用反射机制,在运行时再尝试确定类型信息。
本篇博文会结合Thinking in Java 的demo 和实际开发中碰到的例子,对Java反射和获取类型信息做总体上整理。文章主要分为三块:
Java类加载和初始化
Java中RTTI
Java利用反射获取运行时类型信息
一:Java类加载和初始化
在学习RTTI的时候,首先需要知道Java中类是如何加载的,java又是如何根据这些class文件得到JVM中需要的信息(备注:我在此处实在是想不到更好的描述,望读者可以给出更好的描述)
1.1 类加载器(类加载的工具)
类加载器子系统包含一条加载器链,只有一个“原生的类加载器”他是jvm实现的一部分,可以用来记载本地jar包内的class,若涉及加载网络上的类,或者是web服务器应用,可以挂接额外的类加载器。
1.2 Java使用一个类所需的准备工作
1.2.1 动态加载
所有的类都是第一次使用的时候,动态加载到JVM中。创建对类的静态成员的引用,加载这个类。Java程序在开始运行的时候并非完全加载,类都是用的地方在加载,这就是动态加载
①:首先检查这个类是否被加载
②:如果没有加载,再去根据类名查找.class文件,加载类的字节码,并校验是否存在不良代码,
测试代码如下:
//candy.javapublic class Candy { static { System.out.println("loading Candy"); } }//co