JDK动态代理实现
JDK动态代理实现过程
代理过程:被代理类A需要实现接口C,代理类B需要实现InvocationHandler接口,重写Invoke方法(定义了代理逻辑)。
1,首先创建接口C
public interface Star {
String sign(String name,int num);
String dance(String name);
}
2,然后创建被代理类A
public class LiuDeHua implements Star {
@Override
public String sign(String name,int num) {
System.out.println(name+num);
return "唱完";
}
@Override
public String dance(String name) {
System.out.println("开心的马骝");
return "跳完";
}
}
3,通过java.lang.reflect.Proxy类去创建代理对象,入参分别为被代理类A的类加载器、A的类接口方法、代理类B的实例(此处用了匿名内部类)
LiuDeHua ldh = new LiuDeHua();
Star starProxy = (Star)Proxy.newProxyInstance(ldh.getClass().getClassLoader(),
ldh.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws
Throwable {
System.out.println(proxy.getClass().getMethods());
System.out.println("内部类前置****"+args[0]);
Object invoke = method.invoke(ldh, args); //通过反射执行被代理对象ldh里面的方法,args参数个数必须和被代理类原方法一致
System.out.println("内部类后置****");
return "123";
}
});
System.out.println(starProxy.sign("666",1));//调用生成的代理类去执行方法sing,入参会传入Object[] args
invoke方法里面的第一个参数是生成的代理类对象,return "123"会覆盖原来方法的返回值,
而且类型必须和被代理方法返回类型一致,不然会报错。
总结:动态代理执行流程
1.底层生成一个 $ Proxy0类,严格来说生成的是$Proxy0类的字节码内容
2.代理类把被代理类中所有方法都重写,把所有方法都转去调用InvocationHandler.invoke方法
3.invoke方法中有用户自定义逻辑,也会通过method.invoke反射调用被代理对象的目标方法
4.就这样完成了代理,执行目标方法前输出一行语句,记录日志,统计耗时等都可以实现.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了