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代理机制分为静态代理和动态代理两种类型。静态代理通过编译时确定代理对象,而动态代理则在运行时动态创建代理对象,提供更大的灵活性。两种方式各有优缺点,选择哪一种取决于具体的应用场景。

上一篇:SpringBoot集成Quartz 实现定时任务管理
下一篇:Java设计模式之-------建造者模式

发表评论

最新留言

很好
[***.229.124.182]2025年05月16日 06时51分32秒