当前位置:首页 > Java

java如何代理

2026-03-19 18:49:12Java

代理模式的基本概念

代理模式是一种结构型设计模式,通过创建一个代理对象来控制对目标对象的访问。代理对象可以在调用目标对象的方法前后添加额外的逻辑,例如权限检查、日志记录或延迟加载。

java如何代理

静态代理的实现

静态代理需要手动创建代理类,代理类和目标类实现相同的接口。

java如何代理

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

// 真实对象
class RealSubject implements Subject {
    public void request() {
        System.out.println("RealSubject handles the request.");
    }
}

// 代理类
class Proxy implements Subject {
    private RealSubject realSubject;

    public void request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        System.out.println("Proxy pre-processing.");
        realSubject.request();
        System.out.println("Proxy post-processing.");
    }
}

// 使用代理
public class StaticProxyDemo {
    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.request();
    }
}

动态代理的实现

动态代理通过java.lang.reflect.Proxy在运行时生成代理对象,无需手动编写代理类。

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

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

// 真实对象
class RealSubject implements Subject {
    public void request() {
        System.out.println("RealSubject handles the request.");
    }
}

// InvocationHandler实现
class DynamicProxyHandler implements InvocationHandler {
    private Object target;

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

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("DynamicProxy pre-processing.");
        Object result = method.invoke(target, args);
        System.out.println("DynamicProxy post-processing.");
        return result;
    }
}

// 使用动态代理
public class DynamicProxyDemo {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        Subject proxy = (Subject) Proxy.newProxyInstance(
            realSubject.getClass().getClassLoader(),
            realSubject.getClass().getInterfaces(),
            new DynamicProxyHandler(realSubject)
        );
        proxy.request();
    }
}

CGLIB动态代理

CGLIB通过继承目标类生成代理对象,适用于无接口的类。

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

// 目标类(无接口)
class RealSubject {
    public void request() {
        System.out.println("RealSubject handles the request.");
    }
}

// MethodInterceptor实现
class CglibProxyInterceptor implements MethodInterceptor {
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("CGLIB pre-processing.");
        Object result = proxy.invokeSuper(obj, args);
        System.out.println("CGLIB post-processing.");
        return result;
    }
}

// 使用CGLIB代理
public class CglibProxyDemo {
    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(RealSubject.class);
        enhancer.setCallback(new CglibProxyInterceptor());
        RealSubject proxy = (RealSubject) enhancer.create();
        proxy.request();
    }
}

代理模式的应用场景

  • 远程代理:控制对远程对象的访问(如RPC调用)。
  • 虚拟代理:延迟加载资源(如图片懒加载)。
  • 保护代理:控制对敏感对象的访问权限。
  • 日志代理:在方法调用前后记录日志。

通过静态代理、动态代理或CGLIB代理,可以灵活地扩展对象的功能,同时保持代码的解耦和可维护性。

标签: java
分享给朋友:

相关文章

java如何打开

java如何打开

安装Java开发环境 下载并安装Java Development Kit (JDK),推荐从Oracle官网或OpenJDK获取最新版本。安装完成后配置环境变量,确保JAVA_HOME和PATH变量正…

如何运行java文件

如何运行java文件

运行Java文件的方法 确保已安装Java Development Kit (JDK),可通过命令行输入java -version和javac -version验证安装。 编写Java代码并保存为.…

java如何创建对象

java如何创建对象

创建对象的基本方法 在Java中,创建对象主要通过new关键字调用构造函数完成。基本语法为: ClassName objectName = new ClassName(); 例如创建String对象…

java前景如何

java前景如何

Java 当前的市场需求 Java 在企业级开发、大数据、云计算等领域仍占据重要地位。许多大型企业(如银行、电商平台)依赖 Java 构建后端系统。招聘平台数据显示,Java 开发岗位数量稳定,尤其在…

java如何导入jar包

java如何导入jar包

在Eclipse中导入JAR包 右键项目 -> 选择"Properties" -> 左侧导航选择"Java Build Path" -> 切换到"Libraries"标签 ->…

java如何连接mysql数据库

java如何连接mysql数据库

连接 MySQL 数据库的步骤 添加 MySQL 驱动依赖 在项目中引入 MySQL 的 JDBC 驱动。如果使用 Maven,可以在 pom.xml 中添加以下依赖: <dependency…