温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java Proxy代理工作原理是什么

发布时间:2025-10-17 13:21:46 来源:亿速云 阅读:109 作者:小樊 栏目:编程语言

Java Proxy代理的工作原理主要基于动态代理机制。以下是其详细的工作流程:

1. 定义接口

首先,需要定义一个或多个接口,这些接口将被代理类实现。

public interface Subject {
    void request();
}

2. 实现接口

创建一个实现了上述接口的具体类。

public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("RealSubject: Handling request.");
    }
}

3. 创建InvocationHandler

InvocationHandler是一个接口,它包含一个invoke方法,该方法会在代理实例上调用任何方法时被调用。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class DynamicProxyHandler implements InvocationHandler {
    private Object realSubject;

    public DynamicProxyHandler(Object realSubject) {
        this.realSubject = realSubject;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 在调用实际方法之前可以添加额外的逻辑
        System.out.println("DynamicProxyHandler: Before calling " + method.getName());

        // 调用实际对象的方法
        Object result = method.invoke(realSubject, args);

        // 在调用实际方法之后可以添加额外的逻辑
        System.out.println("DynamicProxyHandler: After calling " + method.getName());

        return result;
    }
}

4. 创建代理实例

使用Proxy.newProxyInstance方法创建一个代理实例。该方法需要三个参数:

  • 类加载器(ClassLoader)
  • 代理类实现的接口数组
  • InvocationHandler实例
import java.lang.reflect.Proxy;

public class ProxyFactory {
    public static Object createProxy(Object realSubject) {
        return Proxy.newProxyInstance(
            realSubject.getClass().getClassLoader(),
            realSubject.getClass().getInterfaces(),
            new DynamicProxyHandler(realSubject)
        );
    }
}

5. 使用代理实例

通过代理实例调用方法时,实际上会调用InvocationHandler的invoke方法。

public class Client {
    public static void main(String[] args) {
        // 创建实际对象
        Subject realSubject = new RealSubject();

        // 创建代理对象
        Subject proxySubject = (Subject) ProxyFactory.createProxy(realSubject);

        // 通过代理对象调用方法
        proxySubject.request();
    }
}

输出结果

运行上述代码,输出结果如下:

DynamicProxyHandler: Before calling request
RealSubject: Handling request.
DynamicProxyHandler: After calling request

工作原理总结

  1. 定义接口和实现类:定义需要代理的接口和实现该接口的具体类。
  2. 创建InvocationHandler:实现InvocationHandler接口,并在invoke方法中添加额外的逻辑。
  3. 创建代理实例:使用Proxy.newProxyInstance方法创建代理实例,传入类加载器、接口数组和InvocationHandler实例。
  4. 使用代理实例:通过代理实例调用方法时,实际会调用InvocationHandler的invoke方法,在该方法中可以添加额外的逻辑,然后再调用实际对象的方法。

这种机制使得代理模式可以在运行时动态地创建代理对象,而不需要在编译时确定代理类的具体实现。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手