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代理,可以灵活地扩展对象的功能,同时保持代码的解耦和可维护性。






