
Java设计模式----------代理模式
发布日期:2021-05-06 19:33:33
浏览次数:20
分类:精选文章
本文共 2358 字,大约阅读时间需要 7 分钟。
Java代理机制解析
代理的概念
代理类在软件开发中扮演着重要角色,其核心作用是控制对象的访问权限。就好比经纪人和演员的关系,有些事情不用演员亲自去做,经纪人就直接替他处理。同样,在编程中,当我们不需要直接操作被代理对象时,代理类可以间接调用其方法。
静态代理
静态代理是一种在编译时确定代理对象的方式。其实现方式是:目标类和代理类必须实现同一个接口,这样在编译阶段就能知道被代理的是哪个对象。这种方式的优点是性能较高,因为它是在编译阶段就可以替换目标对象,而不会有方法调用时的额外开销。
示例
定义一个接口 Animal
:
public interface Animal { void eat(); // 食物 void run(); // 跑步}
实现类 Cat
:
public class Cat implements Animal { @Override public void eat() { System.out.println("猫吃鱼"); } @Override public void run() { System.out.println("喵喵叫"); }}
创建一个静态代理类 StaticProxy
:
public class StaticProxy implements Animal { private Animal animal; public StaticProxy(Animal animal) { this.animal = animal; } @Override public void eat() { animal.eat(); } @Override public void run() { animal.run(); }}
测试静态代理:
@Testpublic void fun3() { Cat c = new Cat(); StaticProxy staticProxy = new StaticProxy(c); staticProxy.eat(); staticProxy.run();}
运行结果:
猫吃鱼喵喵叫
动态代理
动态代理则不同,它不需要在编译时就确定被代理对象。在运行时,动态代理通过InvocationHandler
接口扩展方法行为。这种方式的优势在于可以在不暴露被代理对象的情况下,灵活地扩展其方法行为。
InvocationHandler实现
创建一个自定义的InvocationHandler
:
public class MyInvocationHandler implements InvocationHandler { private Object target; public MyInvocationHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { method.invoke(target, args); return null; }}
使用动态代理创建代理对象:
@Testpublic void fun2() { Cat cat = new Cat(); // 获取Cat实现的接口 Class [] interfaces = cat.getClass().getInterfaces(); // 创建InvocationHandler实例 MyInvocationHandler myInvocationHandler = new MyInvocationHandler(cat); // 使用动态代理创建代理对象 ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); Animal proxy = (Animal) Proxy.newProxyInstance( classLoader, interfaces, myInvocationHandler); proxy.eat(); proxy.run();}
运行结果:
猫吃鱼喵喵叫
动态代理的优势
通过动态代理,我们可以在不直接操作被代理对象的情况下,扩展其方法行为。这种方式特别适用于需要对已有类进行行为扩展,而无需修改源代码的场景。
Proxy.newProxyInstance的使用
Proxy.newProxyInstance
方法用于创建动态代理对象,其方法如下:
- 第一个参数:指定的类加载器。
- 第二个参数:被代理类实现的接口。
- 第三个参数:InvocationHandler实例。
通过这些参数,Proxy.newProxyInstance
能够创建一个代理对象,使其在调用目标对象的方法时,通过InvocationHandler
扩展方法行为。
总结
Java代理机制分为静态代理和动态代理两种类型。静态代理通过编译时确定代理对象,而动态代理则在运行时动态创建代理对象,提供更大的灵活性。两种方式各有优缺点,选择哪一种取决于具体的应用场景。
发表评论
最新留言
很好
[***.229.124.182]2025年05月16日 06时51分32秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
linux 将文件内容赋值给shell脚本中的变量
2023-02-01
Linux 小小的cd命令,用的好可不简单哦!
2023-02-01
Linux 常用压缩命令全解,一次搞懂通关!
2023-02-01
Linux 常用命令
2023-02-01
linux 常用命令
2023-02-01
linux 常用命令
2023-02-01
Linux 常用命令
2023-02-01
Linux 常用命令之cat、tac、nl
2023-02-01
Linux 常用命令使用方法大搜刮
2023-02-01
Linux 常用命令大全
2023-02-01
Linux 常用网络命令
2023-02-01
linux 常用软件安装-目录
2023-02-01
Linux 常见必备
2023-02-01
linux 常见问题大全
2023-02-01
Linux 常规问题解决:File “/usr/bin/yum“, line 30 及 File “/usr/libexec/urlgrabber-ext-down“, line 28
2023-02-01
Linux 开发工具
2023-02-01
Linux 开放服务端口
2023-02-01
Linux 强大的网络命令:nc,网络的瑞士军刀!
2023-02-01
Linux 快速创建文件并写入内容
2023-02-01
LINUX 快速配置
2023-02-01