java动态代理

代理是一种设计模式。 当我们想添加或修改现有类的某些功能时,我们创建并使用代理对象。 使用代理对象而不是原始对象。 通常,代理对象具有与原始对象相同的方法,并且在Java代理类中,通常会extend原始类。 代理具有原始对象的句柄,并可以在该对象上调用方法。

这样,代理类可以以便捷的方式实现许多事情:

  • 在方法开始和停止时记录
  • 对参数进行额外检查
  • 嘲笑原始类的行为
  • 实现对昂贵资源的懒惰访问

无需修改该类的原始代码。 (以上列表并不广泛,仅是示例。)

在实际应用中,代理类不会直接实现功能。 遵循单责任原则,代理类仅进行代理,并且实际的行为修改在处理程序中实现。 当调用代理对象而不是原始对象时,代理将决定是否必须调用原始方法或某些处理程序。 处理程序可以执行其任务,也可以调用原始方法。

即使代理模式不仅适用于在运行时创建代理对象和代理Cass的情况,但这在Java中也是一个特别有趣的话题。 在本文中,我将重点介绍这些代理。

这是一个高级主题,因为它需要使用反射类,或者字节代码操作或编译动态生成的Java代码。 或所有这些。 要使新类在运行时还不能用作字节码,将需要生成字节码,并需要一个用于加载字节码的类加载器。 要创建字节码,可以使用cglib或bytebuddy或内置的Java编译器。

当我们考虑代理类及其调用的处理程序时,我们可以理解为什么在这种情况下责任分离很重要。 代理类是在运行时生成的,但是可以将代理类调用的处理程序编码为常规源代码,并沿着整个程序的代码进行编译(编译时)。

最简单的方法是使用java.lang.reflect.Proxy类,它是JDK的一部分。 该类可以创建一个代理类或直接创建它的一个实例。 Java内置代理的使用很容易。 您需要做的就是实现一个java.lang.InvocationHandler以便代理对象可以调用它。 InvocationHandler接口非常简单。 它仅包含一个方法: invoke()invoke() ,参数包含被代理的原始对象,被调用的方法(作为反射Method对象)和原始参数的对象数组。 示例代码演示了用法:

package proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class JdkProxyDemo {interface If {void originalMethod(String s);}static class Original implements If {public void originalMethod(String s) {System.out.println(s);}}static class Handler implements InvocationHandler {private final If original;public Handler(If original) {this.original = original;}public Object invoke(Object proxy, Method method, Object[] args)throws IllegalAccessException, IllegalArgumentException,InvocationTargetException {System.out.println("BEFORE");method.invoke(original, args);System.out.println("AFTER");return null;}}public static void main(String[] args){Original original = new Original();Handler handler = new Handler(original);If f = (If) Proxy.newProxyInstance(If.class.getClassLoader(),new Class[] { If.class },handler);f.originalMethod("Hallo");}}

如果处理程序想要在原始对象上调用原始方法,则它必须有权访问它。 Java代理实现未提供此功能。 您必须自己在代码中将此参数传递给处理程序实例。 (请注意,有一个通常称为proxy的对象作为参数传递给调用处理程序。这是Java反射动态生成的代理对象,而不是我们要代理的对象。)这样,您绝对可以使用单独的对象每个原始类的处理程序对象,或者使用某种共享对象,这些共享对象恰好知道某种方式(如果有任何要调用的方法)来调用哪个原始对象。

作为一种特殊情况,您可以创建一个调用处理程序和一个没有任何原始对象的接口的代理。 甚至不需要任何类来实现源代码中的接口。 动态创建的代理类将实现该接口。

如果要代理的类未实现接口,该怎么办? 在这种情况下,您必须使用其他代理实现。 我们将在下周讨论一下。

翻译自: https://www.javacodegeeks.com/2016/01/java-dynamic-proxy.html

java动态代理

java动态代理_Java动态代理相关推荐

  1. java动态代理_Java 动态代理和依赖注入

    [注]本文译自:https://psamsotha.github.io/jersey/2015/12/16/dynamic-proxies-dependency-injection.html 本文将讨 ...

  2. java动态代理_Java 动态代理 原理解析

    示例 需要代理的接口 public interface IHello {public void sayHello(); } 需要代理的类 public class HelloImpl implemen ...

  3. final类是否可以被代理_Java 动态代理机制分析及扩展,第 2 部分

    本文希望将 Java 动态代理机制从接口扩展到类,使得类能够享有与接口类似的动态代理支持. 设计及特点 新扩展的类名为 ProxyEx,将直接继承于 java.lang.reflect.Proxy,也 ...

  4. java动态语言_java动态类型语言支持(三)

    invokedynamic指令 在前面java动态类型语言支持(一)(二)中我们有提到invokedynamic指令和java.lang.invoke包中的MethodHandle机制,在某种程度上他 ...

  5. java 动态字符串_Java动态编译执行一串字符串,类似于Javascript里的eval函数

    Javascript里的eval函数能动态执行一串js脚本. 那Java里怎么做到呢. 有两种方法: 一种是使用可以执行js脚本的Java类 ScriptEngineManagerpublic sta ...

  6. java 动态编译_Java动态编译

    概述: Java的动态编译就是在运行期直接编译.java文件,执行.class,并且能够获得相关的输入输出,甚至还能监听相关的事件. 步骤: 1.创建或自动生成.java文件 2.调用JavaComp ...

  7. java 动态更新_java动态更新枚举类

    工作中遇到需要对枚举类的值进行动态更新 手动改不现实也不方便 现记录下来方便以后学习使用 1.在工程utils包中添加动态更新枚举类得工具类(根据自己得项目,放到指定位置调用就可以) 2.一开始陷入了 ...

  8. java动态方法_Java 动态方法调用

    Java 动态方法调用 在Java中,如果方法重写只是一种名字空间的编写,那么它最多是让人感到有趣,但没有实际价值,但情况并非如此.方法重写构造成了Java最大的一个概念基础:动态方法调度(dynam ...

  9. java 动态数组_Java动态数组的用法详解

    Java动态数组是一种可以任意伸缩数组长度的对象,在Java中比较常用的是ArrayList,ArrayList是javaAPI中自带的java.util.ArrayList.下面介绍一下ArrayL ...

最新文章

  1. MySQL 5.7 安装指南
  2. elinput内容过长显示悬浮框_excel中一直被忽视的名称框,用好了也能提高效率
  3. 2020即将过去,数据库最好的时代已经到来!
  4. python人脸检测与微信小程序_python+requests对app和微信小程序进行接口测试
  5. 使用Docker保护软件供应链安全
  6. [转载] 老友记——潘石屹 任志强《天台论道》(下)
  7. 把项目中任意文件夹导出为可执行的jar包
  8. MongoDB DBA 实践2-----MongoDB CRUD操作
  9. 按学号查找学生信息 用c语言表达,学生信息管理系统C语言编程.docx
  10. 8051单片机驱动TM1620任意字符循环显示程序(详细注释版)
  11. python中def fun()是什么意思_PYTHON练习-def函数的基础
  12. 学生静态网页设计作品之我的家乡
  13. 哈尔滨学计算机编程学校,哈尔滨中小学生编程学校排名
  14. 07 仿网易严选微信小程序商城
  15. (转)U-Boot启动过程--详细版的完全分析
  16. 再度递表港交所,“快”能否成为绿茶餐厅突围的筹码?
  17. 程序猿生存指南-34 我与清华
  18. 也谈ibm aix jfs2
  19. 硬件设备PS/2指的是什么?都有什么用途?
  20. hexo设置网站的图标Favicon

热门文章

  1. Wannafly挑战赛10F-小H和遗迹【Trie,树状数组】
  2. UOJ#33-[UR #2]树上GCD【长链剖分,根号分治】
  3. P3306-[SDOI2013]随机数生成器【BSGS】
  4. jzoj3846-七天使的通讯【二分图判定】
  5. ABC182——F - Valid payments Editorial
  6. Codeforces Round #669 (Div. 2)
  7. 分布式锁的多种实现方式
  8. 【Python】有效资源爬取并集
  9. 【分享】通过手游赚¥
  10. 某同学工作之后的感悟