类的祖宗是Class,对象的祖宗是Object,成员变量的祖宗是filed。
Class类是反射的基础。
Java程序在运行时,会一直对所有的对象进行所谓的运行时类型标识,这样才能选准正确的方法去执行,也就是俗称的后期绑定。Class类是一个特殊的类,每个类都有一个Class对象,用来封装一个对象和接口的运行时状态,包含了与类相关的信息。每当编写并且编译了一个类,一个Class类型的对象就会自动被创建,它被保存在.class文件中。它没有公共的构造方法,所以你不能显式地声明一个Class对象,它的对象是在加载类时由JVM和classLoader中的子系统自动构造的。每个类都有一个独一无二的Class对象。运行程序的时候,JVM 先检查是不是所要加载的类对应的Class对象已经被加载,如果还没有,那么就根据类名去找相应的.class文件,并且将其Class对象加载进去。
这样说起来,我觉得Class类有点像单例模式,因为每个类都有独一无二的Class对象。
一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象。
既然Class类不能通过new的方法来创建对象,那么有什么方法可以获取Class对象呢?一共有3种方法可以。
1.用Object类自带的getClass方法。
比如
TestClass testClass;
Class class = testClass.getClass();
2.使用Class类自身的静态方法forName(String className),还有一个重载方法需要指定classLoader
比如
Class class = Class.forName("TestClass");
或者
Class class = Class.forName("com.test.class.TestClass");
3.直接使用类名.class
注意,基本类型,数组,也有自己的Class对象,数组也有
比如
Class class = int.class;
一些常用的方法
1. public T newInstance()
这是另外一个可以为类创建实例的方法。
x.getClass().newInstance(),这样的话就会创建一个和x一样类型的新的实例。
使用技巧
1.forName和newInstance一起使用,先创建一个字符串对象,然后根据这个字符串对象的值创建实例
Object object = Class.forName(string).newInstance();
2.因为class对象独一无二,所以可以通过比较
if( example.getClass() == Example.class)