javase-----(13)反射和动态代理

    xiaoxiao2023-10-30  154

    目录

    反射和动态代理

    【一】java中的反射

    1.1 理解class类

    1.2 获取class对象的三种方法

    1.3 class常用的几张方法

    【二】ClassLoader

    2.1 介绍

    2.2 使用类加载器获取当前类目录下的文件

    【三】反射的常用的几种方法(重要后面的spring的原理就是反射和动态代理)

    3.1 Class: 是一个类; 一个描述类的类.

    【四】java动态代理

    4.1 静态代理

    4.2 动态代理


    反射和动态代理

    【一】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方法。

    运行

    最新回复(0)