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

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

服务器学习网综合整理   2024-10-07 10:07:11

Java代理模式的种类 1. 静态代理** 静态代理是在编译时就已经确定代理类和原对象之间的关系。代理类需要手动实现和被代理类相同的接口,并调用被代理类的方法。这种代理方式实现简单,但缺点是每个代理类只能服务于一种类型的对象。** 2. 动态代理** 动态代理则完全不同,它在程序运行时动态生成代理类...

在Java的广阔世界里,代理模式(Proxy Pattern)作为一种结构型设计模式,扮演着至关重要的角色。它允许开发者通过代理对象间接访问目标对象,从而在访问过程中增加额外的功能或控制。那么,Java中的代理模式究竟有多少种?又该如何使用呢?本文将为您详细解答。

Java代理模式的种类

1. 静态代理**

静态代理是在编译时就已经确定代理类和原对象之间的关系。代理类需要手动实现和被代理类相同的接口,并调用被代理类的方法。这种代理方式实现简单,但缺点是每个代理类只能服务于一种类型的对象。**

2. 动态代理**

动态代理则完全不同,它在程序运行时动态生成代理类。Java提供了java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来支持动态代理。这种方式允许一个代理类在运行时动态地代理多个类的方法,极大地提高了代码的复用性和灵活性。**

3. CGLIB代理**

CGLIB代理是基于ASM框架的,它通过生成被代理对象的子类作为代理类。由于是在运行时动态生成的,所以不需要为每一种类型的被代理类都编写一个代理类。CGLIB能够代理没有实现接口的类,但是不能代理final类。**

怎样使用Java代理模式

静态代理的使用

静态代理的实现相对直接,首先定义一个接口,然后让被代理类和代理类都实现这个接口。在代理类中,通过调用被代理类的方法,并在其前后加入额外的逻辑来实现功能增强。

public interface Service {
    void request();
}

public class RealService implements Service {
    @Override
    public void request() {
        System.out.println("真实服务被请求");
    }
}

public class ProxyService implements Service {
    private RealService realService;

    public ProxyService(RealService realService) {
        this.realService = realService;
    }

    @Override
    public void request() {
        System.out.println("代理服务处理前置逻辑");
        realService.request();
        System.out.println("代理服务处理后置逻辑");
    }
}

动态代理的使用

动态代理的使用依赖于Java的反射机制。你需要实现InvocationHandler接口,并在其invoke方法中定义代理逻辑。然后,使用Proxy.newProxyInstance方法创建代理对象。

public class ServiceInvocationHandler implements InvocationHandler {
    private Object realService;

    public ServiceInvocationHandler(Object realService) {
        this.realService = realService;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("日志记录: 调用方法 " + method.getName());
        Object result = method.invoke(realService, args);
        System.out.println("日志记录: 方法 " + method.getName() + " 调用结束");
        return result;
    }
}

// 创建代理对象
Service proxyService = (Service) Proxy.newProxyInstance(
    realService.getClass().getClassLoader(),
    realService.getClass().getInterfaces(),
    new ServiceInvocationHandler(realService)
);

CGLIB代理的使用

CGLIB代理的使用较为复杂,但非常强大。你需要使用CGLIB提供的Enhancer类来创建代理对象,并设置回调接口(如MethodInterceptor)。

public class ProxyFactory implements MethodInterceptor {
    private Object target;

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

    public Object getProxyInstance() {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("开始事务...");
        Object result = method.invoke(target, args);
        System.out.println("提交事务...");
        return result;
    }
}

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

通过以上介绍,相信您对Java中的代理模式有了更深入的了解。无论是静态代理、动态代理还是CGLIB代理,它们都在各自的场景下发挥着重要作用,极大地提高了代码的灵活性和可扩展性。

推荐文章