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. window 下Eclipse c++的开发环境配置
  2. Windows软件授权管理工具 slmgr命令详解
  3. 【STM32】PWM 输出实验代码详解
  4. 手机控件查看工具uiautomatorviewer
  5. linux mysql 系统时间函数吗_Linux 宝库 - Mysql日期和时间函数不求人
  6. vue设置img大小的属性_Vue.js自定义标签属性并获取属性,及绑定img的src属性的坑...
  7. python write函数换行_Python基础知识(三)
  8. GoldWave的消音、淡入淡出、改变音乐速率
  9. 换行符在HTML中直接替换为br
  10. 工资管理系统数据库设计
  11. 微信小程序如何搭建自己的后台(超详细,超完整)(上线必备)!!!
  12. 什么教我们用计算机画画,作文:我第一次用电脑画画
  13. 设置QQ空间背景音乐
  14. android 带头像的弹幕,原生Canvas实现带头像的弹幕
  15. 基于CNI保护Kubernetes集群中的主机
  16. 关于软件工程课程的学习计划
  17. Trustzone 硬件架构
  18. 微信小程序录音功能实现
  19. Android app应用开发高级进阶系列专栏解读
  20. 物联网IOT面临挑战

热门文章

  1. DF-TAR: A Deep Fusion Network for Citywide Traffic Accident Risk Prediction... 阅读笔记
  2. C语言编译c158,PANTONE潘通色卡C卡_图文.doc
  3. c语言scanf中的分隔符的作用,C语言中scanf与分隔符(空格回车Tab)
  4. BMP格式知识之三:bmp格式的编解码
  5. DataTable 插件 Uncaught TypeError: Cannot read property ‘top‘ of undefined
  6. 给自己电脑增加数T的空间(不用添加硬盘)
  7. Python 协程并发在Arduino中的运用(实验)
  8. Es新规范-总结(Es5-Es10)
  9. 用html计算2的6次方,word,excel,网页上如何打x的n次方
  10. 交流访问学者如何拒绝邀请函的方法?