三种实现动态代理方式(jdk、cglib、javaassist)
2018-02-05 16:05
701 查看
在编写程序与实现某些功能时,我们经常会使用到动态代理。动态代理是个很简单但是很有效的东西。在我们平时使用的框架中,像servlet的filter、包括spring提供的aop以及struts2的拦截器都使用了动态代理功能。我们日常看到的mybatis分页插件,以及日志拦截、事务拦截、权限拦截这些几乎全部由动态代理的身影。它的实现原理是非常简单的,就是在方法实现前后加入对应的公共功能,下面我写了以下三种方式的实现
package com.jfinal.template; import javassist.util.proxy.MethodHandler; import javassist.util.proxy.ProxyFactory; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import org.junit.Test; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * Created by TT on 2018-02-05. */ public class CglibTest { @Test public void test() throws Exception { //jdk //缺点 必须有接口 //优点 简单 T1 t1 = (T1)Proxy.newProxyInstance(T1_00.class.getClassLoader(), T1_00.class.getInterfaces(), new T1_01(new T1_00())); t1.say(); //cglib Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(T2.class); enhancer.setCallback(new T2_01(new T2())); T2 t2 = (T2)enhancer.create(); t2.say(); //javaassist ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.setSuperclass(T3.class); proxyFactory.setHandler(new T3_01(new T3())); T3 t3 = (T3)proxyFactory.createClass().newInstance(); t3.say(); } } class T3 { public void say() { System.out.println("ccc"); } } class T3_01 implements MethodHandler { private T3 t3; public T3_01(T3 t3) { this.t3 = t3; } @Override public Object invoke(Object o, Method method, Method method1, Object[] objects) throws Throwable { System.out.println("ccc before"); method.invoke(new T3(), objects); System.out.println("ccc after"); return o; } } class T2 { public void say() { System.out.println("bbb"); } } class T2_01 implements MethodInterceptor { private T2 t2; public T2_01(T2 t2) { this.t2 = t2; } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("before day"); method.invoke(t2, objects); System.out.println("before after"); return o; } } interface T1 { void say(); } class [/b]T1_00 implements T1{ @Override public void say() { System.out.println("aaa"); } } class T1_01 implements InvocationHandler { private T1_00 t1_00 = null; public T1_01(T1_00 t1_00) { this.t1_00 = t1_00; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before"); method.invoke(t1_00, args); System.out.println("after"); return proxy; } }
相关文章推荐
- 深入理解java动态代理的两种实现方式(JDK/Cglib)
- (学习笔记)Java的JDK动态代理与CGLIB动态代理实现
- JDK、CGLIB、Spring三种实现代理的区别(一)JDK Proxy 解析基于Java 8
- java 动态代理的两种方式(jdk,cglib)
- 动态代理的两种实现方式(JDK/Cglib)
- Spring中AOP实现的两种方式之JDK和cglib的动态代理
- 动态代理及其两种实现方式(JDK、CGLIB)
- java动态代理的两种方式---jdk和cglib
- Spring系列之 (十一):AOP实现方式:动态代理的两个方式(JDK和Cglib)
- Java探索之——动态代理(JDK和CGlib方式)
- Java动态代理之JDK实现和CGlib实现
- Java的动态代理实现(JDK默认和CGLIB)
- Java静态代理与动态代理(JDK、CGLIB实现)
- Java动态代理之JDK实现和CGlib实现(简单易懂)
- Java动态代理之JDK实现和CGlib实现(简单易懂)
- Java之JDK和CGlib实现动态代理-yellowcong
- java动态代理(JDK和cglib实现对比)
- Java动态代理模式jdk和cglib的2种实现以及二者的区别(AOP面向切面的前奏)
- Java中三种代理方式—— 静态代理与两种动态代理的实现机制
- Spring AOP 代理实现的两种方式: JDK动态代理 和 Cglib框架动态代理