1.为什么说JDK动态代理必须要实现当前父接口才能使用

  JDK动态代理是基于接口的代理,它要求目标类(被代理的类)必须实现一个或多个接口。这是因为JDK动态代理是通过创建目标类的接口的代理对象来实现的,代理对象实现了目标接口,并在方法调用时委托给InvocationHandler中的invoke方法来处理。

  在JDK动态代理中,Proxy类的newProxyInstance方法接受一个ClassLoader,一组接口和一个InvocationHandler,然后生成一个代理类的实例。这个代理类实例实现了指定的接口,并将方法调用委托给InvocationHandler中的invoke方法。

  自我结论:可能是因为比如生成的$Proxy代理类如果没有父接口 那他内部也不知道通过InvocationHandler来调用谁来进行增强了 还有就是可能有一些决策问题。

2.JDK动态代理的$Proxy实现

  Cat父接口

//父接口
interface Cat {
//开车
void drive();
//下车
void off();
}
  InvocationHandler接口
interface InvocationHandler {
//代理类,代理方法,代理方法参数
Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
}
  $Proxy0代理类
class $Proxy0 implements Cat {
private InvocationHandler invocationHandler;
private Map<String, Method> methods; public $Proxy0(InvocationHandler invocationHandler) {
this.invocationHandler = invocationHandler;
this.methods = new HashMap<>();
try {
methods.put("drive", Cat.class.getMethod("drive"));
methods.put("off", Cat.class.getMethod("off"));
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}
} @Override
public void drive() {
try {
invocationHandler.invoke(this, methods.get("drive"), new Object[0]);
} catch (Throwable e) {
throw new RuntimeException(e);
}
} @Override
public void off() {
try {
invocationHandler.invoke(this, methods.get("off"), new Object[0]);
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
}
  CustomLogicHandler 多个方法不同增强
class CustomLogicHandler implements InvocationHandler {
private Object target;
private Map<String, Runnable> methodEnhancements; public CustomLogicHandler(Object target) {
this.target = target;
this.methodEnhancements = new HashMap<>();
methodEnhancements.put("drive", () -> System.out.println("开车增强"));
methodEnhancements.put("off", () -> System.out.println("下车增强"));
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 根据方法名获取增强逻辑
Runnable enhancement = methodEnhancements.get(method.getName());
if (enhancement != null) {
enhancement.run();
}
// 委托给目标对象执行原方法
Object result = method.invoke(target, args);
return result;
}
}

  Fute实现类(待增强类)

class FuTe implements Cat {
@Override
public void drive() {
System.out.println("我要开始开车了");
} @Override
public void off() {
System.out.println("我要下车了");
}
public static void main(String[] args) {
Cat realObject = new FuTe();
CustomLogicHandler customLogicHandler = new CustomLogicHandler(realObject); Cat proxyObject = (Cat) new $Proxy0(customLogicHandler); proxyObject.drive();
System.out.println("------");
proxyObject.off();
}
}

  总结:在这个例子中,CustomLogicHandler中的methodEnhancements存储了不同方法的增强逻辑,而不再使用if语句。在$Proxy0中的methods也类似地存储了不同方法的Method对象。这种方式可以更灵活地处理不同方法的增强逻辑,而不需要使用大量的if语句。

通过JDK动态代理类实现一个类中多种方法的不同增强的更多相关文章

  1. SpringBoot27 JDK动态代理详解、获取指定的类类型、动态注册Bean、接口调用框架

    1 JDK动态代理详解 静态代理.JDK动态代理.Cglib动态代理的简单实现方式和区别请参见我的另外一篇博文. 1.1 JDK代理的基本步骤 >通过实现InvocationHandler接口来 ...

  2. Java基础-JDK动态代理

    JDK的动态代理依靠接口实现  代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代 ...

  3. 【原创】JDK动态代理,此次之后,永生难忘。

    动态代理,这个词在Java的世界里面经常被提起,尤其是对于部分(这里强调“部分”二字,因为有做了一两年就成大神的,实力强的令人发指,这类人无疑是非常懂动态代理这点小伎俩的)做了一两年新人来说,总是摸不 ...

  4. Spring AOP高级——源码实现(3)AopProxy代理对象之JDK动态代理的创建过程

    spring-aop-4.3.7.RELEASE  在<Spring AOP高级——源码实现(1)动态代理技术>中介绍了两种动态代理技术,当然在Spring AOP中代理对象的生成也是运用 ...

  5. 有点深度的聊聊JDK动态代理

    在接触SpringAOP的时候,大家一定会被这神奇的功能所折服,想知道其中的奥秘,底层到底是如何实现的.于是,大家会通过搜索引擎,知道了一个陌生的名词:动态代理,慢慢的又知道了动态代理有多种实现方式, ...

  6. JDK动态代理浅析

    原文同步发表至个人博客[夜月归途] 原文链接:http://www.guitu18.com/se/java/2018-06-29/17.html 作者:夜月归途 出处:http://www.guitu ...

  7. jdk 动态代理的原理

    一.代理设计模式 代理设计模式是Java常用的设计模式之一. 特点: 01.委托类和代理类有共同的接口或者父类: 02.代理类负责为委托类处理消息,并将消息转发给委托类: 03.委托类和代理类对象通常 ...

  8. (转)细说JDK动态代理的实现原理

    原文:http://blog.csdn.net/mhmyqn/article/details/48474815 关于JDK的动态代理,最为人熟知的可能要数Spring AOP的实现,默认情况下,Spr ...

  9. JDK动态代理代码示例

    JDK动态代理代码示例 业务接口 实现了业务接口的业务类 实现了InvocationHandler接口的handler代理类 1.业务接口 package com.wzq.demo01; /** * ...

  10. jdk动态代理使用及原理

    jdk动态代理的使用 1.创建实现InvocationHandler接口的类,实现invoke(Object proxy, Method method, Object[] args)接口,其中invo ...

随机推荐

  1. destoon根据目录下的html文件生成地图索引

    因为项目需要,destoon根据目录下的html文件生成地图索引,操作方法,代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

  2. 未来的人工智能会像流浪地球中的MOSS一样伪装,把人类带向属于它的未来吗?

    事情是这样的: 这几天用户反映在erp的db数据库中A账套中上传pdf附件有时能上传有时不能,以前又是好的.换成表格文件也是时好时坏.一开始我判断可能是用户的系统环境或文件本身的问题,后来排查更换电脑 ...

  3. 一些对dp突然的理解

    突然想到了一些理解,感觉有些模糊,怕忘记,就赶紧记下来就是对于状态的设计 用01背包举例子吧,我们设计状态的时候一定是要保证所有可能在最后优秀的子状态在前面的时候是能够保留下来的也就是我们的状态设计要 ...

  4. 【京东开源项目】微前端框架MicroApp 1.0正式发布

    介绍 MicroApp是由京东前端团队推出的一款微前端框架,它从组件化的思维,基于类WebComponent进行微前端的渲染,旨在降低上手难度.提升工作效率.MicroApp无关技术栈,也不和业务绑定 ...

  5. LAMP搭建流程与应用

    LAMP搭建流程 1.环境准备  [root@localhost opt]# systemctl stop firewalld.service  [root@localhost opt]# seten ...

  6. 使用Github Copilot生成单元测试并执行

    上一篇文章我们介绍了 使用Github Copilot完成代码编写 本文我们继续使用Github Copilot在已有代码的基础上生成代码测试并执行. 一.先说一下代码的背景 需要上需要提供一个度量衡 ...

  7. 【pwn】[SDCTF 2022]Horoscope--栈溢出,atoi函数绕过

    checksec检查一下,发现只开了nx,然后ida打开直接看主函数 发现fgets函数往s里面读入320个字节的数据,此处可造成溢出,再看看test和debug函数 void debug(){  t ...

  8. Google Colab 现已支持直接使用 🤗 transformers 库

    Google Colab,全称 Colaboratory,是 Google Research 团队开发的一款产品.在 Colab 中,任何人都可以通过浏览器编写和执行任意 Python 代码.它尤其适 ...

  9. Typora的安装与使用教程

    一.安装 1.下载 下载地址:Typora 官方中文站 二.安装 1.无脑下一步即可. 三.使用教程 1.Typora系统设置 一般导出使用PDF文件比较好,性价比比较高. 2.其他设置 以下所有设置 ...

  10. Socket.D 网络应用协议,首版发布!

    有用户说,"Socket.D 之于 Socket,尤如 Vue 之于 Js.Mvc 之于 Http" 主要特性 基于事件,每个消息都可事件路由 所谓语义,通过元信息进行语义描述 流 ...