类加载与动态代理

动态代理

所谓动态,就是在运行期间生成代理类。不然,有100个需要被代理的类,你就得手动写100个代理类,代码膨胀得厉害。

而我现在的目标是弄清楚jdk如何实现动态代理。

阅读Proxy类的源码能够看清大体流程:

1、我们自己提供接口和类加载器,然后jdk去通过Class.forName的方式去加载以及初始化这些接口,并生成类型信息。

2、有了这些接口的类型信息,就可以通过反射得到所有的方法的信息

3、这个时候有2种选择:通过已有的信息生成代理类的java源代码文件,然后动态编译生成class文件。

而jdk用的是另一种,将已有信息直接写入class文件。因为class文件的内容分布是固定的,所以按照class文件的格式一个一个的写二进制流就可以实现。

相比第一种,第二种的效率更高。

4、有了class文件,就可以调用defineClass方法生成代理类的类型信息

5、有了代理类的类型信息,就可以通过反射调用无参构造方法,生成代理类的实例。

通过动态代理的实现原理,可以清楚的看到:类加载机制相对灵活,只要你能得到符合规范的class文件,就可以生成对应的类型信息,然后通过反射就可以干很多事情。

但是动态代理的唯一遗憾是必须要实现接口,而另外还有一种方式---cglib,可以更加灵活的实现动态代理。关于cglib,且听下回分解。

时间: 2024-10-12 00:20:25

类加载与动态代理的相关文章

注释 类加载器 动态代理

类加载器 *         bootstrap 根类加载器  核心包下的类  不是类 *         ext  扩展类加载器   扩展包下的类 *         app  应用加载器   自定义的类 第三提供的类 * *         Class *                         ClassLoader getClassLoader()获取类加载器 *        ClassLoader *                            ClassLoade

Java 动态代理是基于什么原理(还没整理完)

1> Java的反射机制在平时的业务开发过程中很少用到,但是在一些基础框架的搭建上应用非常广泛 2>什么是Java反射机制 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. 3>反射机制提供了哪些功能 ----在运行时判定任意一个对象所属的类 ----在运行时构造任意一个类的对象 ----在运行时判定任意一个类所具有的成员变量和方法 --

[email protected]动态代理-类加载器

一.测试单元     概述:用于测试JAVA代码的工具类,已内置在Eclipse中;     格式:         1.在方法的上面添加@Test;         2.对被测试的方法的要求:权限-public;返回值-void;参数-空参         [email protected]:在@Test标注的方法前执行,可以用于初始化;           @After:在@Test标注的方法后执行,可以用于释放资源; 二.注解     概述:java的一种数据类型,和类/接口在同一级别  

【JAVAWEB学习笔记】25_基础加强:类加载器、注解 @xxx和动态代理

基础加强 学习目标 案例-自定义单元测试@MyTest 案例-全局的编码的解决 一.类加载器 1.什么是类加载器,作用是什么? 类加载器就加载字节码文件(.class) 2.类加载器的种类 类加载器有三种,不同类加载器加载不同的 1)BootStrap:引导类加载器:加载都是最基础的文件 2)ExtClassLoader:扩展类加载器:加载都是基础的文件 3)AppClassLoader:应用类加载器:三方jar包和自己编写java文件 怎么获得类加载器?(重点) ClassLoader 字节码

注解 、 动态代理、类加载

单元测试 @Test eclipse自带jar包 Ctrl+1导入使用 注解 JDK提供的注解 @Deprecated 表示被修饰的方法已经过时 @Override 重写方法 1.5支持父类不支持接口 1.5之后支持接口 @SuppressWarnings 抑制警告 需要给属性值 all 所有的警告都被抑制 ({    }) "unused" 没有使用警告 "rawtypes" 类型不安全警告 "unchecked" 使用不安全 安全检查 &qu

第17天(基础加强_注解_类加载器_动态代理)_学习目标版本

学习目标 能够使用Junit进行单元测试 能够说出注解的作用 能够使用JDK提供的3个注解 能够根据基本语法编写自定义注解实现类 能够了解自定义注解解析 能够了解元注解使用 能够根据上课案例分析,编写模拟@Test案例 能够理解动态代理原理 能够使用动态代理Proxy编写代理类 Junit单元测试 Junit介绍 JUnit是一个Java语言的单元测试框架,简单理解为可以用于取代java的main方法.Junit属于第三方工具,一般情况下需要导入jar包,不过,多数Java开发环境已经集成了JU

框架学习前基础加强 泛型,注解,反射(泛型&注解)应用案例,IOC,Servlet3.0,动态代理,类加载器

泛型 1. 泛型类 :具有一个或多个类型变量的类,称之为泛型类! class A<T> { } 2. 在创建泛型类实例时,需要为其类型变量赋值 A<String> a = new A<String>(); * 如果创建实例时,不给类型变量赋值,那么会有一个警告! 3. 泛型方法 :具有一个或多个类型变量的方法,称之为泛型方法! class A<T> { public T fun(T t1) {} } fun()方法不是泛型方法!它是泛型类中的一个方法! pu

类加载器,注解,动态代理

一.类加载器 1.什么是类加载器,作用是什么? 类加载器就加载字节码文件(.class) 2.类加载器的种类 类加载器有三种,不同类加载器加载不同的 1)BootStrap:引导类加载器:加载都是最基础的文件 2)ExtClassLoader:扩展类加载器:加载都是基础的文件 3)AppClassLoader:应用类加载器:三方jar包和自己编写java文件 怎么获得类加载器?(重点) ClassLoader 字节码对象.getClassLoader(); Class clazz = XXX.c

Java进阶学习第24天——动态代理与类加载器

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.06.17 lutianfei none 动态代理 代理对象存在的价值:主要用于拦截对真实业务对象的访问. 代理对象有什么方法? 现在要生成某一个对象的代理对象,这个代理对象通常也要编写一个类来生成,所以首先要编写用于生成代理对象的类. 如何编写生成代理对象的类,两个要素: 代理谁 如何生成代理对象 代理谁? 设计一个类变量,以及一个构造函数,记住代理类 代理哪个对象. 如何生成代理对象? 设计一个方法生成代理对象(在