每个类都会有一个Class对象,所有的类都是在首次使用时动态加载到JVM中。类加载器首先会检查该类的Class对象是否已经被加载,如果尚未被夹在。默认的类加载器就会根据类名查找.class文件,然后加载该类到内存。他就用来创建这个类的所有对象。
1. Class对象:
1.1 获取一个类的Class对象: Class.forName();或使用类字面常量,这样做在编译期会接受检查,不需要捕获异常。不仅普通的类,接口、数组及基本数据类型都有字面常量。类名.class
1.2 Class类。Class对象总是指向某个Class对象,可以制造类的实例,包含该类的静态成员,作用于这些事例的所有方法代码。JAVA 1.5之前使用的是普通类引用,1.5之后将类引用使用泛型语法变得更加具体。使用泛型语法的类之后,会让编译器强制执行额外的类型检查。为了使用泛化的Class引用时放松限制,可以使用通配符“?”,表示任何事物。使用普通的Class引用时若果犯错,直到运行的时候才会被发现。创建Class引用,被限定为某种类型或该类型的任何子类型,可以使用<? extends >
注:Class<?>和Class是等价的,Class<?>的好处是表示程序员就是自己选择使用非具体的版本而不是由于疏忽。
1.3 普通的Class和泛化的Class还有个区别,在使用泛型语法的Class时使用newInstance()返回该对象的确切类型,而普通的Class返回的是Object
1.4 使用泛型语法获得父类的Class引用
2. 反射相关类 : java.lang.reflect包 包括了Field、Method、Constructor类,每个类都实现了Menber接口。这些类对象都是在JVM运行时创建的。
反射机制提供了足够的支持,使得能够创建一个在编译时完全未知的对象,并调用此对象的方法。
2.1 获取类的构造函数、属性和方法
2.2 创建对象
2.3 访问类属性 一般用来修改源码中类成员的值
2.4 调用函数
注:利用反射调用私有属性、构造函数或者方法时要设置Accessible属性为true。