Java的三种代理模式简述
Java的三种代理模式为静态代理、动态代理和CGLIB代理。
一、静态代理
静态代理指的是代理对象在编译期已经确定的情况下所使用的代理模式。代理类与委托类实现了相同的接口,代理类对目标对象进行了包装,所以在调用目标对象时需要通过代理对象来执行。静态代理在性能方面较差,但是实现较为简单,常用于简单业务场景。
示例:
interface Subject {
void request();
}
class RealSubject implements Subject{
@Override
public void request() {
System.out.println("RealSubject request.");
}
}
class ProxySubject implements Subject{
private RealSubject realSubject;
public ProxySubject(RealSubject realSubject){
this.realSubject = realSubject;
}
@Override
public void request() {
System.out.println("ProxySubject request.");
realSubject.request();
}
}
public class Test {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
ProxySubject proxySubject = new ProxySubject(realSubject);
proxySubject.request();
}
}
二、动态代理
动态代理指的是在运行时对目标对象进行包装的代理模式,相比于静态代理,动态代理无需手动编写代理类,可根据目标对象的接口,动态的创建代理对象,并在代理对象中动态的处理方法调用、参数校验等逻辑。由于动态代理是在运行时创建的代理对象,所以性能较静态代理有所提升。常用于需要动态创建代理对象的场景。
示例:
interface Subject {
void request();
}
class RealSubject implements Subject{
@Override
public void request() {
System.out.println("RealSubject request.");
}
}
class DynamicProxy implements InvocationHandler{
private Object target;
public DynamicProxy(Object target){
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("DynamicProxy before.");
Object result = method.invoke(target, args);
System.out.println("DynamicProxy after.");
return result;
}
}
public class Test {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
DynamicProxy dynamicProxy = new DynamicProxy(realSubject);
Subject proxySubject = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), dynamicProxy);
proxySubject.request();
}
}
三、CGLIB代理
CGLIB代理是一种针对类来实现代理的方式,通过生成目标对象的子类来实现代理逻辑。使用CGLIB代理时,被代理对象无需实现任何接口,因为生成的代理类是继承于目标对象的子类,所以可直接操作目标对象的全部属性和方法。由于采用字节码生成技术,CGLIB代理的性能通常比JDK动态代理性能更高。常用于需要代理类的场景。
示例:
class RealSubject {
public void request() {
System.out.println("RealSubject request.");
}
}
class CglibProxy implements MethodInterceptor{
public Object createProxy(Class<?> targetClass){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(targetClass);
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("CglibProxy before.");
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("CglibProxy after.");
return result;
}
}
public class Test {
public static void main(String[] args) {
CglibProxy cglibProxy = new CglibProxy();
RealSubject proxySubject = (RealSubject)cglibProxy.createProxy(RealSubject.class);
proxySubject.request();
}
}
以上就是Java中三种代理模式的详细介绍及示例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java的三种代理模式简述 - Python技术站