前言
相关链接
- cglib maven 地址:https://mvnrepository.com/artifact/cglib/cglib
- javassist maven 依赖地址:https://mvnrepository.com/artifact/org.javassist/javassist
JDK动态代理
- 创建一个接口 Subject
- 创建一个被代理的类 RealSubject 并实现 Subject接口
- 创建动态代理处理类 JdkInvocationHandler,并实现 InvocationHandler 接口,重写 invoke 方法
- 设置被代理接口并提供获取被被代理接口示例对象的方法
- 测试
Subject 接口
```java package top.simba1949.jdk;
/**
- @author Anthony
- @date 2020/11/17 15:27 / public interface Subject { /*
/**
- @author Anthony
- @date 2020/11/17 15:28
*/
public class RealSubject implements Subject{
@Override
public String doSomething() {
} } ```System.out.println("RealSubject doSomething");return "SUCCESS";
JdkInvocationHandler 代理处理类
```java package top.simba1949.jdk;
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;
/**
- 代理处理类
- @author Anthony
@date 2020/11/17 15:29 / public class JdkInvocationHandler implements InvocationHandler { /*
被代理的类 */ private Subject target;
public JdkInvocationHandler(Subject target) { this.target = target; }
/**
- invoke 方法
- @param proxy 动态代理的类实例
- @param method 调用的方法
- @param args 调用方法的参数
- @return
@throws Throwable */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(“do something before”); // result 是被代理方法的返回值 Object result = method.invoke(target, args); System.out.println(“do something after”); return result; }
/**
- 获取被代理接口实例对象
- @return
*/
public Subject getProxy(){
// 第一个参数是类加载器,用于加载这个代理类
// 第二个参数是Class数组,里面存放的是待实现的接口信息
// 第三个参数是InvocationHandler实例
return (Subject) Proxy.newProxyInstance(target.getClass().getClassLoader(),
} } ```target.getClass().getInterfaces(), this);
测试
```java package top.simba1949.jdk;
/**
- jdk动态代理测试
- @author Anthony
- @date 2020/11/17 15:32
*/
public class JdkInvocationHandlerApp {
public static void main(String[] args) {
} } ```// realSubject 被代理的类RealSubject realSubject = new RealSubject();Subject proxy = new JdkInvocationHandler().getProxy();proxy.doSomething();
cglib动态代理
引入 cglib 包
cglib maven 地址:https://mvnrepository.com/artifact/cglib/cglib
<!-- https://mvnrepository.com/artifact/cglib/cglib --><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version></dependency>
SubjectService 被代理类
package top.simba1949.cglib;/*** @author Anthony* @date 2020/11/17 16:06*/public class SubjectService {public String doSomething(String info){System.out.println("doSomething: " + info);return "SUCCESS";}}
代理处理类
package top.simba1949.cglib;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;/*** 代理处理类* @author Anthony* @date 2020/11/17 16:08*/public class CglibMethodInterceptor implements MethodInterceptor {/**** @param obj 表示增强的对象* @param method 表示被拦截的方法;* @param objects 表示被拦截方法的参数;* @param methodProxy 表示要触发父类的方法对象;* @return* @throws Throwable*/@Overridepublic Object intercept(Object obj, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("do something before");// result 是返回结果Object result = methodProxy.invokeSuper(obj, objects);System.out.println("do something after");return result;}}
测试
package top.simba1949.cglib;import net.sf.cglib.proxy.Enhancer;/*** @author Anthony* @date 2020/11/17 16:15*/public class CglibApp {public static void main(String[] args) {// 通过CGLIB动态代理获取代理对象的过程Enhancer enhancer = new Enhancer();// 设置enhancer对象的父类enhancer.setSuperclass(SubjectService.class);// 设置enhancer的回调对象enhancer.setCallback(new CglibMethodInterceptor());// 创建代理对象SubjectService proxy = (SubjectService)enhancer.create();// 通过代理对象调用目标方法String result = proxy.doSomething("INFO");System.out.println("MAIN METHOD " + result);}}
javassist 动态代理
引入 javassist 依赖包
<!-- https://mvnrepository.com/artifact/org.javassist/javassist --><dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.27.0-GA</version></dependency>
SubjectService 被代理类
package top.simba1949.javassist;/*** @author Anthony* @date 2020/11/17 17:12*/public class SubjectService {public String doSomething(String info){System.out.println("SubjectService:doSomething:" + info);return "SUCCESS";}}
代理处理类
package top.simba1949.javassist;import javassist.util.proxy.MethodHandler;import java.lang.reflect.Method;/*** @author Anthony* @date 2020/11/17 17:11*/public class JavassistMethodHandler implements MethodHandler {/**** @param self 代理类的实例* @param thisMethod 表示被拦截的方法* @param proceed 表示要触发父类的方法对象* @param args 表示被拦截方法的参数;* @return* @throws Throwable*/@Overridepublic Object invoke(Object self, Method thisMethod, Method proceed, Object[] args) throws Throwable {System.out.println("do something before");Object result = proceed.invoke(self, args);System.out.println("do something after");return result;}}
测试
package top.simba1949.javassist;import javassist.util.proxy.ProxyFactory;import javassist.util.proxy.ProxyObject;/*** @author Anthony* @date 2020/11/17 17:05*/public class App {public static void main(String[] args) throws IllegalAccessException, InstantiationException {// 创建代理工厂ProxyFactory proxyFactory = new ProxyFactory();// 设置代理类的父类,也是被代理类proxyFactory.setSuperclass(SubjectService.class);// 生成动态代理类Class<?> aClass = proxyFactory.createClass();// 创建动态代理类的实例Object proxyInstance = aClass.newInstance();// 设置动态处理方式JavassistMethodHandler javassistMethodHandler = new JavassistMethodHandler();((ProxyObject)proxyInstance).setHandler(javassistMethodHandler);// 执行代理方法String result = ((SubjectService) proxyInstance).doSomething("INFO");System.out.println("MAIN METHOD" + result);}}
