JDK动态代理:通过创建和原始类实现相同接口的代理类 来实现方法的增强
CGLIB动态代理:通过创建原始类的子类 来实现方法的增强
/**
* JDK动态代理
**/
public interface Imove(){
void move();
}
// 目标类
public class Person implements Imove{
@Overide
void move(){
system out print("我是初始的移动方法")
}
}
public class PersonHandler implements InvocationHandler{
private Object target;
public PersonHandler (Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("开始移动之前...");
Object result = method.invoke(target, args);
System.out.println("移动结束之后...");
return result;
}
}
public class main{
public static void main(String []args){
Imove person=new Person()
// 创建动态代理
Imove personProxy = (Imove) Proxy.newProxyInstance(
person.getClass().getClassLoader(),
person.getClass().getInterfaces(),
new PersonHandler(person)
);
// 调用方法
personProxy.move()
}
}
CGLIB动态代理
<!-- Maven 依赖 -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
// 目标类
class Tank {
public void move() {
System.out.println("Tank moving...");
}
}
// CGlib 代理类
class CglibProxy implements MethodInterceptor {
private Object target; // 被代理的目标对象
private CglibProxy(Object target) {
this.target = target;
}
// 创建代理对象的静态方法
public static Object createProxy(Object target) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass()); // 设置目标类为父类
enhancer.setCallback(new CglibProxy(target)); // 设置回调对象为本身
return enhancer.create(); // 创建代理对象
}
// 实现 MethodInterceptor 接口的 intercept 方法
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("Start logging...");
Object result = proxy.invoke(target, args); // 调用目标对象的方法
System.out.println("Stop logging...");
return result;
}
}
public class Main {
public static void main(String[] args) {
// 创建目标类的代理对象
Tank tankProxy = (Tank) CglibProxy.createProxy(new Tank());
// 通过代理对象调用方法
tankProxy.move();
}
}
总结:jdk动态代理是基于接口的动态代理,只能代理实现了接口的类
cglib动态代理是基于继承的动态代理,通过创建目标类的子类实现