前言
相关链接
- 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
*/
@Override
public 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
*/
@Override
public 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);
}
}