当前位置:首页 > 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是一门面向对象的编程语言,掌握基础语法是入门的关键。需要了解变量、数据类型、运算符、控制结构(如if-else、for循环、while循环)、数组等概念。可以通过官方文…

java如何学习

java如何学习

学习Java的有效方法 理解基础概念 Java是一门面向对象的编程语言,掌握基础概念如变量、数据类型、运算符、控制语句(if-else、循环)是必要的。面向对象的核心概念包括类、对象、继承、多态和封装…

如何编写java程序

如何编写java程序

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

如何编译java文件

如何编译java文件

安装JDK 确保系统已安装Java Development Kit(JDK)。可通过命令行输入 javac -version 和 java -version 验证。若未安装,需从Oracle或Open…

如何选择java培训

如何选择java培训

评估培训机构资质 选择有正规资质的机构,查看其营业执照、办学许可证等。优先考虑具备人力资源和社会保障部或教育部认证的机构,这类机构的教学质量和课程设置通常更规范。 考察课程内容与行业需求匹配度…

java如何实现多继承

java如何实现多继承

在Java中,由于语言设计本身不支持多继承(即一个类不能直接继承多个父类),但可以通过以下方式间接实现类似多继承的效果: 使用接口实现多继承 接口允许一个类实现多个接口,从而继承多个抽象行为。接口中…