MST

星途 面试题库

面试题:Java设计模式之代理模式

请简述Java代理模式的概念,并说明静态代理和动态代理的区别,同时用代码示例展示动态代理的实现。
45.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

Java代理模式概念

代理模式是一种设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在代理模式中,代理对象可以在调用目标对象的方法前后进行一些额外的操作,比如权限验证、日志记录等。代理对象与目标对象实现相同的接口,从而可以在不改变目标对象代码的情况下增加功能。

静态代理和动态代理的区别

  1. 静态代理
    • 代理类在编译期就已经确定,是手动编写的,代理类和目标类实现相同的接口。
    • 每个目标类都需要对应一个代理类,如果目标类很多,会导致代理类数量急剧增加,代码维护成本高。
  2. 动态代理
    • 代理类在运行期动态生成,不需要手动编写代理类。
    • 可以通过反射机制在运行时为不同的目标对象生成代理对象,更加灵活,可扩展性强。

动态代理代码示例

  1. 定义接口
public interface Subject {
    void request();
}
  1. 定义目标类
public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("RealSubject is handling request.");
    }
}
  1. 定义InvocationHandler实现类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class DynamicProxyHandler implements InvocationHandler {
    private Object target;

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

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Before method invocation");
        Object result = method.invoke(target, args);
        System.out.println("After method invocation");
        return result;
    }
}
  1. 生成代理对象并调用方法
import java.lang.reflect.Proxy;

public class DynamicProxyExample {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        DynamicProxyHandler handler = new DynamicProxyHandler(realSubject);
        Subject proxy = (Subject) Proxy.newProxyInstance(
                realSubject.getClass().getClassLoader(),
                realSubject.getClass().getInterfaces(),
                handler);
        proxy.request();
    }
}

在上述代码中,Subject是目标接口,RealSubject是实现该接口的目标类。DynamicProxyHandler实现了InvocationHandler接口,在invoke方法中可以在目标方法调用前后添加额外逻辑。DynamicProxyExample类通过Proxy.newProxyInstance方法生成代理对象,并调用代理对象的request方法,此时会执行DynamicProxyHandlerinvoke方法的逻辑。