2022-04-28-设计模式之代理模式-JDK动态代理模式
2022/4/28 6:14:29
本文主要是介绍2022-04-28-设计模式之代理模式-JDK动态代理模式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
java设计模式之代理模式-JDK动态代理模式学习整理
动态代理(分为JDK动态代理、cglib动态代理)
代理对象不需要实现接口,但是目标对象需要实现接口,否则不能使用动态代理。
是通过JDK的API创建代理对象,动态的创建代理对象。JDK通过反射包下的Proxy类的newProxyInstance方法动态创建代理对象。
动态代理利用了JDK API,动态地在内存中构建代理对象,从而实现对目标对象的代理功能。动态代理又被称为JDK代理或接口代理。
静态代理与动态代理的区别主要在:
1)静态代理在编译时就已经实现,编译完成后代理类是一个实际的class文件
2)动态代理是在运行时动态生成的,即编译完成后没有实际的class文件,而是在运行时动态生成类字节码,并加载到JVM中
Proxy的静态方法获取代理实例:
被代理对象:
关键-两个核心jar包:
JDK动态代理,动态处理器:代理规则(invoke):
JDK动态代理测试类:
执行结果:
代理规则中的invoke方法中的第一个参数Object proxy似乎没有用到。
public Object getProxyInstance(){
/**
* Object newProxyInstance(ClassLoader loader, 目标类(target)的加载器
* Class<?>[] interfaces, 目标类的接口
* InvocationHandler h) 事件处理,调用目标方法时,会触发事件处理方法
*/
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("JDK代理开始 。。。");
反射机制调用目标对象的方法 Object ret = method.invoke(target, args); System.out.println("JDK代理结束 。。。"); return ret; } } ); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before calling " + method.getName()); Object result = method.invoke(object, args); System.out.println("after calling " + method.getName()); return result; }
参考资料:
1)kkb-wln-teacher直播公开课:
https://www.kaikeba.com/open/item?c=1463
2)其他网络资料
这篇关于2022-04-28-设计模式之代理模式-JDK动态代理模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?