JDK Proxy

必须实现接口,没有实现接口用cglib.

Animal接口

package com.example.test.jdk_proxy;/*** @Author humorchen* @Date 2021/12/30*/
public interface Animal {/*** say** @return say something*/String say();
}

Cat实现Animal接口

package com.example.test.jdk_proxy;/*** @author humorchen* @date 2021/12/30 15:03*/
public class Cat implements Animal {/*** say** @return say something*/@Overridepublic String say() {return "喵喵喵~";}
}

测试创建动态代理对象

package com.example.test.jdk_proxy;import java.lang.reflect.Proxy;/*** jdk动态代理** @author humorchen* @date 2021/12/30 15:02*/
public class ProxyDemo {public static void main(String[] args) {Cat cat = new Cat();Animal animalProxyInstance = (Animal) Proxy.newProxyInstance(Cat.class.getClassLoader(), Cat.class.getInterfaces(), (proxy, method, args1) -> {System.out.println("invoke before");Object result = method.invoke(cat, args1);System.out.println("invoke result: " + result);System.out.println("invoke after");return result;});animalProxyInstance.say();}
}

运行结果:

CGLib

spring对于实现了接口的类会采用jdk proxy,否则使用cglib做动态代理。
也可以配置都使用cglib

Cat类

package com.example.test.cglib;/*** @author humorchen* @date 2021/12/30 15:17*/
public class Cat {/*** 猫写作** @return*/public String write() {return "cat write letter";}
}

创建代理对象

package com.example.test.cglib;import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;/*** cglib demo** @author humorchen* @date 2021/12/30 15:18*/
public class CgLibDemo {public static void main(String[] args) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(Cat.class);enhancer.setCallback((MethodInterceptor) (object, method, args1, methodProxy) -> {System.out.println("invoke before");Object result = methodProxy.invokeSuper(object, args1);System.out.println("invoke result: " + result);System.out.println("invoke after");return result;});Cat cat = (Cat) enhancer.create();cat.write();}
}

运行结果:

AspectJ

Dog类

package com.example.test.aspectj;import org.springframework.stereotype.Component;/*** @author humorchen* @date 2021/12/30 15:44*/
@Component
public class Dog {public String say() {return "汪汪汪";}
}

切面类

package com.example.test.aspectj.aspect;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;/*** @author humorchen* @date 2021/12/30 15:45*/
@Aspect
@Component
public class DogAspect {/*** 声明切点*/@Pointcut("execution(String com.example.test.aspectj.Dog.say())")public void dogSay() {}/*** 切点之前执行*/@Before(value = "dogSay()")public void before() {System.out.println("@Before executed");}/*** 切点之后执行*/@After(value = "dogSay()")public void after() {System.out.println("@After executed");}/*** 环绕** @param joinPoint* @return*/@Around(value = "dogSay()")public Object around(ProceedingJoinPoint joinPoint) {System.out.println("@Around before executed");Object result = null;try {result = joinPoint.proceed();System.out.println("@Around proceed result: " + result);} catch (Throwable e) {e.printStackTrace();}System.out.println("@Around after executed");return result;}/*** return之后** @param joinPoint* @param returnObject*/@AfterReturning(value = "dogSay()", returning = "returnObject")public void afterReturning(JoinPoint joinPoint, Object returnObject) {System.out.println("@AfterReturning,result: " + returnObject);}/*** 抛出异常后的处理** @param e*/@AfterThrowing(value = "dogSay()", throwing = "e")public void afterThrowing(Throwable e) {System.err.println("@AfterThrowing,error message: " + e.getMessage());}
}

启动类


package com.example.test.aspectj;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;/*** @author humorchen* @date 2021/12/30 15:41*/
@SpringBootApplication
public class Application implements ApplicationListener<ApplicationReadyEvent> {@Autowiredprivate Dog dog;public static void main(String[] args) {SpringApplication.run(Application.class, args);}/*** 应用启动完后执行** @param applicationReadyEvent*/@Overridepublic void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {System.out.println("call result: " + dog.say());}
}

运行结果:

Java jdk proxy、cglib、aspectj 三种常用代理示范相关推荐

  1. JDK和CGLIB动态代理原理

    JDK动态代理原理解析 一.例子: 1.定义基础接口 public interface HttpApi {String get(String url); } 2.实现类 public class Re ...

  2. Java JDK代理、CGLIB、AspectJ代理分析比较

    前言 什么是代理,在Design patterns In java这个本书中是这样描述的,简单的说就是为某个对象提供一个代理,以控制对这个对象的访问.在不修改源代码的基础上做方法增强,代理是一种设计模 ...

  3. Java提高班(六)反射和动态代理(JDK Proxy和Cglib)

    反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多.要怎么理解以上这句话,请看下文. 一.反射 反射机制是 Ja ...

  4. Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

    class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出 ...

  5. java动态代理(JDK和cglib)详解

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

  6. java动态代理(JDK和cglib)

    2019独角兽企业重金招聘Python工程师标准>>> JAVA的动态代理  代理模式  代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托 ...

  7. JVM插桩之四:Java动态代理机制的对比(JDK和CGLIB,Javassist,ASM)

    一.class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件, ...

  8. Java中如何实现代理机制(JDK、CGLIB)

    代理分为两种: 1.静态代理 2.动态代理  动态代理又分为两种:jdk 实现  :Cglib 实现 3.Java中如何实现代理机制(JDK.CGLIB) JDK动态代理:代理类和目标类实现了共同的接 ...

  9. JAVA静态代理与动态代理(JDK和CGLIB)

    代理就是有一些工作你不屑于自己做的,或者不方便自己做的,这个时候你就请别人帮你做,拿我最喜欢的偶像坤坤做例子,他开演唱会肯定不会自己收门票,不会自己清场打扫卫生,所以就需要代理来代替他完成一整场演唱会 ...

最新文章

  1. Eureka 注册中心/服务发现框架
  2. ML基石_11_HazardOfOverfitting
  3. Delphi中的线程类
  4. VirtualBox 安装Centos 之访问虚拟机里面的服务受阻解决方案
  5. 4.RabbitMQ 4种交换模式
  6. mysql 层_mysql三层体系
  7. 软件外包项目中的进度管理
  8. 使用ActiveMQ和HornetQ通过WebSocket通过STOMP轻松进行消息传递
  9. 幻兽天下修复版java_宠物天下四-幻兽天下
  10. python中一切数据都是对象吗_python中的深拷贝(deepcopy)和浅拷贝(copy)
  11. 越狱后必装软件_iOS 13全系统越狱详细教程疑难解答
  12. springboot 2.x 使用定时任务执行多次问题
  13. leetcode算法题第二题(c++)
  14. java数组动态长度_JAVA中如何动态改变数组长度 动态数组 arraycopy
  15. 小学生计算机房的简笔画,小学生校园风景简笔画图片
  16. 基于CarSystemUI实现左侧导航栏NavigationBar及下拉面板定制开发1——Android10智能座舱
  17. 技术开放平台,推进开放银行布局
  18. 关于微信小程序uniapp版的推送消息
  19. 从头打造纯python的mud游戏-基于Evennia(1)
  20. Kubernetes 生产环境安装部署 基于 Kubernetes v1.14.0 之 etcd集群

热门文章

  1. 面向对象之静态方法(static)和实例化方法的区别
  2. 关于电脑打开热点不能上网问题
  3. 微信社群录播转播 选择裂变工具可快速引流
  4. Latex引用bib文件步骤
  5. 我的谷歌音乐播放器简介
  6. 真阳性假阳性假阴性分割可视化
  7. 只要一个软件让电脑硬盘瞬间扩容10T空间 | 阿里云盘变本地硬盘。
  8. 头豹-2020年中国真人密室逃脱行业概览——附下载链接
  9. 如何拒绝公司耍无赖?(2)
  10. LowRecyclerView:一个简单强大的RecyclerView工具类