目录
【三】反射的常用的几种方法(重要后面的spring的原理就是反射和动态代理)
反射和动态代理
【一】java中的反射
1.1 理解class类
- Class 对象只能由系统建立对象
- 一个类在 JVM 中只会有一个Class实例
- 每个类的实例都会记得自己是由哪个 Class 实例所生成
1.2 获取class对象的三种方法
- 通过类名获取 类名.class
- 通过对象获取 对象名.getClass()
- 通过全类名获取 Class.forName(全类名)
1.3 class常用的几张方法
【二】ClassLoader
2.1 介绍
类装载器是用来把类(class)装载进 JVM 的。JVM 规范定义了两种类型的类装载器:启动类装载器(bootstrap)和用户自定义装载器(user-defined class loader)。 JVM在运行时会产生3个类加载器组成的初始化加载器层次结构 ,如下图所示:
2.2 使用类加载器获取当前类目录下的文件
首先,系统类加载器可以加载当前项目src目录下面的所有类,如果文件也放在src下面,也可以用类加载器来加载调用 getResourceAsStream 获取类路径下的文件对应的输入流.
public class ReflectionTest {
@Test
public void testClassLoader() throws FileNotFoundException{
//src目录下,直接加载
InputStream in1 = null;
in1 = this.getClass().getClassLoader().getResourceAsStream("test1.txt");
//放在内部文件夹,要写全路径
InputStream in2 = null;
in2 = this.getClass().getClassLoader().getResourceAsStream("com/atguigu/java/fanshe/test2.txt");
}
}
【三】反射的常用的几种方法(重要后面的spring的原理就是反射和动态代理)
3.1 Class: 是一个类; 一个描述类的类.
封装了描述方法的 Method,
描述字段的 Filed,
描述构造器的 Constructor 等属性.
- 如何得到 Class 对象:
Person.class
person.getClass()
Class.forName("com.atguigu.javase.Person")
- 关于 Method:
如何获取 Method:
1、getDeclaredMethods: 得到 Method 的数组.
2、getDeclaredMethod(String methondName, Class ... parameterTypes)
如何调用 Method
1、如果方法时 private 修饰的, 需要先调用 Method 的 setAccessible(true), 使其变为可访问
2、method.invoke(obj, Object ... args);
- 关于 Field:
如何获取
Field: getField(String fieldName)
如何获取 Field 的值:
setAccessible(true)
field.get(Object obj)
如何设置 Field 的值:
field.set(Obejct obj, Object val)
了解 Constructor 和 Annotation
- 反射和泛型.
getGenericSuperClass: 获取带泛型参数的父类, 返回值为: BaseDao<Employee, String>
Type 的子接口: ParameterizedType
可以调用 ParameterizedType 的 Type[] getActualTypeArguments() 获取泛型参数的数组.
【四】java动态代理
4.1 静态代理
- 写接口
- 实现类
- 代理类
- 运行
4.2 动态代理
- 接口
- 实现类
- 写实现InvocationHandler中有一个invoke方法,所有执行代理对象的方法都会被替换成执行invoke方法。
- 运行