服务器学习网 > 编程学习 > Java的代理模式有多少种,怎样使用?

Java的代理模式有多少种,怎样使用?

服务器学习网综合整理   2024-08-07 17:00:55

Java代理模式的两大分类 Java中的代理模式主要分为两大类:静态代理与动态代理。 静态代理:在程序运行前就已经存在的代理类。这种方式需要我们手动编写代理类,并在其中实现对目标对象的代理逻辑。虽然这种方式简单直观,但缺点也很明显——当目标对象接口发生变动时,代理类也需要相应修改,维护成本较高。...

在Java的浩瀚设计模式海洋中,代理模式(Proxy Pattern)无疑是一颗璀璨的明珠,它巧妙地通过引入一个代理对象来控制对目标对象的访问,从而实现了功能的增强、访问控制、日志记录等多种目的。那么,Java中的代理模式究竟有多少种?我们又该如何使用它们呢?

Java代理模式的两大分类

Java中的代理模式主要分为两大类:静态代理动态代理

  • 静态代理:在程序运行前就已经存在的代理类。这种方式需要我们手动编写代理类,并在其中实现对目标对象的代理逻辑。虽然这种方式简单直观,但缺点也很明显——当目标对象接口发生变动时,代理类也需要相应修改,维护成本较高。

  • 动态代理:动态代理类是在程序运行时通过反射机制动态生成的。Java提供了两种主要的动态代理机制:基于接口的JDK动态代理基于类的CGLIB动态代理

怎样使用?

JDK动态代理

重点JDK动态代理要求目标对象必须实现一个或多个接口。通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口实现。

// 目标接口
interface Subject {
    void request();
}

// 目标对象实现
class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("处理请求");
    }
}

// 代理处理器
class ProxyHandler implements InvocationHandler {
    private Object target;

    public ProxyHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("处理前");
        Object result = method.invoke(target, args);
        System.out.println("处理后");
        return result;
    }

    // 获取代理对象
    public static Subject getProxy(Subject realSubject) {
        return (Subject) Proxy.newProxyInstance(
                realSubject.getClass().getClassLoader(),
                realSubject.getClass().getInterfaces(),
                new ProxyHandler(realSubject)
        );
    }
}

CGLIB动态代理

重点CGLIB可以在运行时动态生成一个类的子类,因此不需要目标对象实现接口。它主要通过继承的方式来实现代理。

// 省略具体实现,但注意CGLIB通常用于没有实现接口的类

Java的代理模式有多少种,怎样使用?

通过上述两种方式,我们可以根据实际需要选择适合的代理模式,灵活地在Java项目中实现功能的扩展与控制。无论是静态代理的简洁直观,还是动态代理的灵活多变,都为我们提供了强大的编程武器。

推荐文章