实现动态代理的两种方式

本文通过两个实例介绍如何使用 JDK 和 CGLIB 在 Java 中实现动态代理。首先展示了一个基于接口的 JDK 动态代理实现,随后介绍了利用 CGLIB 库进行动态代理的方法。这两个例子不仅展示了动态代理的基本原理,还提供了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一种使用jdk实现
第二种使用cglib实现
代码写的比较飘逸,娱乐与教学并存。

[color=blue][size=large]jdk实现动态代理(接口)[/size][/color]

public interface 打架接口 {
public void 开打();
}



public class 打架 implements 打架接口 {
@Override
public void 开打() {
System.out.println("威哥 打出绝技 降龙十八掌。。。");
}
}



import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class 打架小帮手 implements InvocationHandler{

private Object delegate;

public Object binder(Object delegate) {
this.delegate = delegate;
return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(), this);
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

System.out.println("小弟们 冲啊。。。");
Object invoke = method.invoke(delegate, args);
System.out.println("哥在江湖又留下了一段传说。。。");

return invoke;
}
}



import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;


public class 威哥 {

public static void main(String[] args) {

打架接口 打架接口 = (打架接口) new 打架小帮手().binder(new 打架());
打架接口.开打();
}

// 我要去打架
// 1 叫上小弟
// 2 打架
// 3 哥又留下一段传说
}


[color=blue][size=large]cglib实现动态代理[/size][/color]


public class 打架 {
public void 开打() {
System.out.println("威哥 打出绝技 降龙十八掌。。。");
}
}



import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class 打架小帮手 implements MethodInterceptor {

@Override
public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("小弟们 冲啊。。。");
Object result = methodProxy.invokeSuper(object,args);
System.out.println("哥在江湖又留下了一段传说。。。");
return result;
}

public Object createProxy(Class targetClass){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(targetClass);
enhancer.setCallback(new 打架小帮手());
return enhancer.create();
}
}



public class 威哥 {

public static void main(String rags[]){
打架 打架 = new 打架();
打架小帮手 帮手 = new 打架小帮手();
打架 打架代理 = (打架) 帮手.createProxy(打架.getClass());
打架代理.开打();
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值