->理解 Class 类
->理解 Java 的类加载机制
->学会使用 ClassLoader 进行类加载
->理解反射的机制
->掌握 Constructor、Method、Field 类的用法
->理解 Java 的类加载机制
->学会使用 ClassLoader 进行类加载
->理解反射的机制
->掌握 Constructor、Method、Field 类的用法
->理解并掌握动态代理
反射概述
Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的內部信息,并能直接操作任意对象的内部属性及方法。
Java反射机制主要提供了以下功能:
- 在运行时构造任意一个类的对象
- 在运行时获取任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法(属性)
- 生成动态代理
Class 类
对象照镜子后可以得到的信息:某个类的数据成员名、方法和构造器、某个类到底实现了哪些接口。对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。
Class 对象只能由系统建立对象
一个类在 JVM 中只会有一个Class实例
每个类的实例都会记得自己是由哪个 Class 实例所生成
Class 对象只能由系统建立对象
一个类在 JVM 中只会有一个Class实例
每个类的实例都会记得自己是由哪个 Class 实例所生成
获取 Class 对象的方式
/**
* 关于 Class:
* 1. Class 是一个类
* 2. 对象照镜子后可以得到的信息:某个类的数据成员名、方法和构造器、 某个类到底实现了哪些接口。
* 3. 对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。 一个 Class 对象包含了特定某个类的有关信息。
* 4. Class对象只能由系统建立对象
* 5. 一个类在 JVM 中只会有一个Class实例
*
* @throws ClassNotFoundException
*/
@Test
public void testClass() throws ClassNotFoundException {
Class clazz = null;
// *1. 得到 Class 对象
// 1.1 直接通过 类名.class 的方式得到
clazz = Person.class;
// 1.2 通过对象调用 getClass() 方法来获取
Object obj = new Person();
clazz = obj.getClass();
// 1.3 通过全类名的方式获取. 用的较多。
String className = "com.zto.reflection.entity.Person";
clazz = Class.forName(className);
// Field[] fields = clazz.getDeclaredFields();
System.out.println();
}
获取Class对象的一个实例
/**
* *Class 类的 newInstance() 方法.
*
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws InstantiationException
*/
@Test
public void testNewInstance() throws ClassNotFoundException,
InstantiationException, IllegalAccessException {
String className = "com.zto.reflection.entity.Person";
Class clazz = Class.forName(className);
// 利用 Class 对象的 newInstance() 方法来创建类的一个对象.
// 实际调用的是类的那个 无参数的 构造器!
// 一般地, 一个类若声明了带参数的构造器, 也要声明一个无参数的构造器.
Object obj = clazz.newInstance();
System.out.println(obj);
}
ClassLoader类加载器
类装载器是用来把类(class)装载进 JVM 的。JVM 规范定义了两种类型的类装载器:启动类装载器(bootstrap)和用户自定义装载器(user-defined class loader)。
JVM在运行时会产生3个类加载器组成的初始化加载器层次结构 ,如下图所示:
//表示系统类装载器实例化自类sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$AppClassLoader@19821f
//表示系统类