面试题答案
一键面试Java代理模式概念
代理模式是一种设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在代理模式中,代理对象可以在调用目标对象的方法前后进行一些额外的操作,比如权限验证、日志记录等。代理对象与目标对象实现相同的接口,从而可以在不改变目标对象代码的情况下增加功能。
静态代理和动态代理的区别
- 静态代理:
- 代理类在编译期就已经确定,是手动编写的,代理类和目标类实现相同的接口。
- 每个目标类都需要对应一个代理类,如果目标类很多,会导致代理类数量急剧增加,代码维护成本高。
- 动态代理:
- 代理类在运行期动态生成,不需要手动编写代理类。
- 可以通过反射机制在运行时为不同的目标对象生成代理对象,更加灵活,可扩展性强。
动态代理代码示例
- 定义接口:
public interface Subject {
void request();
}
- 定义目标类:
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject is handling request.");
}
}
- 定义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;
}
}
- 生成代理对象并调用方法:
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
方法,此时会执行DynamicProxyHandler
中invoke
方法的逻辑。