主要作用是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用如一个类需要对其进行一些业务增强,但其关联关系复杂,不能直接对其进行代码修改添加,此时需要使用动态来进行增强 JDK动态代理 优点
无需依赖第三方jar包 缺点
只代理实现接口的类速度较慢 使用场景
需要频繁创建代理对象
实现流程创建InvocationHandler的实现类,并对其invoke方法进行重写。重写后,通过Proxy.newProxyInstance()获取代理对象实例,在调用代理对象方法时会进行监听。
newProxyInstance方法中有三个参数,如下图,第二个个参数通过反射获取对象实现的接口,可以看出JDK动态代理只能代理是实现接口的类
一个接口,实现该接口的类
接口
package com.zys.Service;
public interface ProxyService {
void eat();
}
实现类
package com.zys.Service;
public class ProxyServiceImpl implements ProxyService{
@Override
public void eat() {
System.out.println("吃饭");
}
}
动态代理实现
package com.zys.Service;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKProxyObject implements InvocationHandler {
//代理对象
private Object proxyObject;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("动态代理监听开始");
strengthen();
Object invoke = method.invoke(proxyObject, args);
System.out.println("动态代理监听结束");
return invoke;
}
//获取代理对象
public Object getProxyObject(Object proxyObject){
this.proxyObject = proxyObject;
return Proxy.newProxyInstance(proxyObject.getClass().getClassLoader(),proxyObject.getClass().getInterfaces(),this);
}
//增强方法
public void strengthen(){
System.out.println("执行了增强方法:盛饭");
}
public static void main(String[] args) {
JDKProxyObject jdkProxyObject = new JDKProxyObject();
ProxyService proxyObject = (ProxyService)jdkProxyObject.getProxyObject(new ProxyServiceImpl());
proxyObject.eat();
}
}
执行结果
动态代理监听开始 执行了增强方法:盛饭 吃饭 动态代理监听结束cglib动态代理
利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理
优点代理对象执行速度较快可代理没有实现接口的类 缺点
由于生成子类来处理,不能代理final类生成字节码较慢
package com.zys.Service;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibProxy implements MethodInterceptor {
private Object object;
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("cglib监听开始");
System.out.println("可在此处执行增强方法");
Object invoke = method.invoke(object, objects);
System.out.println("cglib监听结束");
return invoke;
}
public Object getObject(Object object){
this.object = object;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(object.getClass());
enhancer.setCallback(this);
Object en = enhancer.create();
return en;
}
public static void main(String[] args) {
CglibProxy cglibProxy = new CglibProxy();
ProxyServiceImpl proxyService = (ProxyServiceImpl) cglibProxy.getObject(new ProxyServiceImpl());
proxyService.eat();
}
}
执行结果
cglib监听开始 可在此处执行增强方法 吃饭 cglib监听结束



