Java基础之代理

简介: 要想创建一个代理对象,需要使用Proxy类的newProxyInstance方法。

代理


创建代理对象

要想创建一个代理对象,需要使用Proxy类的newProxyInstance方法。这个方法有三个参数:

1. 一个类加载器,作为Java安全模型的一部分,对于系统类和从因特网上下载下来的类,可以使用

不同的类加载器。

2. 一个Class对象数组,每个元素都是需要实现的接口

3. 一个调用处理器。


使用代理可能出于很多原因,例如:

1. 路由对远程服务器的方法调用。

2. 在程序运行期间,将用户接口事件与动作关联起来。

3. 为调试,跟踪方法调用。

public class ProxyTest {
    public static void main(String[] args) {
        Object[] elements = new Object[1000];
        for (int i = 0; i < elements.length; i++) {
            Integer value = i + 1;
            TraceHandler traceHandler = new TraceHandler(value);
            Object proxy = Proxy.newProxyInstance(null, new Class[]{Comparable.class}, traceHandler);
            elements[i] = proxy;
            Integer key = new Random().nextInt(elements.length) - 1;
            int result = Arrays.binarySearch(elements, key);
            if (result >= 0) {
                System.out.println(elements[result]);
            }
        }
    }
}
class TraceHandler implements InvocationHandler {
    private Object target;
    public TraceHandler(Object target) {
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println(target);
        System.out.println("." + method.getName() + "(");
        if (args != null) {
            for (int i = 0; i < args.length; i++) {
                System.out.println(args[i]);
                if (i < args.length - 1) {
                    System.out.println(",");
                }
            }
            System.out.println(")");
        }
        return method.invoke(target, args);
    }
}


代理类的特性

代理类是在程序运行过程中创建的。然而,一旦被创建,就变成了常规类,与虚拟机中的任何其他类没有什么区别。


所有的代理类都扩展于Proxy类。一个代理类只有一个实例域—–调用处理器。它定义在Proxy的超类中。


相关文章
|
5天前
|
设计模式 Java API
[Java]静态代理与动态代理(基于JDK1.8)
本文介绍了代理模式及其分类,包括静态代理和动态代理。静态代理分为面向接口和面向继承两种形式,分别通过手动创建代理类实现;动态代理则利用反射技术,在运行时动态创建代理对象,分为JDK动态代理和Cglib动态代理。文中通过具体代码示例详细讲解了各种代理模式的实现方式和应用场景。
[Java]静态代理与动态代理(基于JDK1.8)
|
12天前
|
Java
Java访问外网图片地址时,如何添加代理?
【10月更文挑战第14天】Java访问外网图片地址时,如何添加代理?
19 2
|
5月前
|
缓存 运维 负载均衡
java面试题之个人对正向代理和反向代理的理解
java面试题之个人对正向代理和反向代理的理解
1069 3
|
8天前
|
Java
Java代码解释静态代理和动态代理的区别
### 静态代理与动态代理简介 **静态代理**:代理类在编译时已确定,目标对象和代理对象都实现同一接口。代理类包含对目标对象的引用,并在调用方法时添加额外操作。 **动态代理**:利用Java反射机制在运行时生成代理类,更加灵活。通过`Proxy`类和`InvocationHandler`接口实现,无需提前知道接口的具体实现细节。 示例代码展示了两种代理方式的实现,静态代理需要手动创建代理对象,而动态代理通过反射机制自动创建。
|
3月前
|
缓存 负载均衡 安全
|
4月前
|
数据采集 安全 Java
Java Selenium WebDriver:代理设置与图像捕获
Java Selenium WebDriver:代理设置与图像捕获
|
4月前
|
设计模式 Java
Java进阶之代理
Java进阶之代理
27 3
|
4月前
|
设计模式 Java
Java进阶之代理
【7月更文挑战第16天】Java动态代理通过`java.lang.reflect.Proxy`和`InvocationHandler`实现,无需编译期定义代理类。与静态代理相比,它更灵活,代码更简洁,适用于方法数量变化或未知接口代理。
24 2
|
4月前
|
Java 数据库 Spring
Java编程问题之在测试中使用CGLIB创建代理类如何解决
Java编程问题之在测试中使用CGLIB创建代理类如何解决
|
4月前
|
缓存 Java 应用服务中间件
Java编程问题之重试机制问题之在CGLIB中设置目标对象类并创建代理类如何解决
Java编程问题之重试机制问题之在CGLIB中设置目标对象类并创建代理类如何解决