目录
反射和动态代理
【一】java中的反射
1.1 理解class类
1.2 获取class对象的三种方法
1.3 class常用的几张方法
【二】ClassLoader
2.1 介绍
2.2 使用类加载器获取当前类目录下的文件
【三】反射的常用的几种方法(重要后面的spring的原理就是反射和动态代理)
3.1 Class: 是一个类; 一个描述类的类.
【四】java动态代理
4.1 静态代理
4.2 动态代理
类装载器是用来把类(class)装载进 JVM 的。JVM 规范定义了两种类型的类装载器:启动类装载器(bootstrap)和用户自定义装载器(user-defined class loader)。 JVM在运行时会产生3个类加载器组成的初始化加载器层次结构 ,如下图所示:
首先,系统类加载器可以加载当前项目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"); } }封装了描述方法的 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() 获取泛型参数的数组.
