标签:create 动态代理 动态 实现类 接口 字节 控制 object 匿名内部类
两种代理模式:
jdk的动态代理是基于接口的动态代理,要求目标对象必须实现至少一个接口,核心API是java.lang.reflect.Proxy
类的newProxyInstance
方法。
Object proxy = Proxy.newProxyInstance(
ClassLoader loader,
Class[] interfaces,
InvocationHandler handler
);
返回值:接口的实现类对象
参数:
loader:类加载器对象
interfaces:代理对象要实现的接口字节码对象数组,通常写成目标对象.getClass().getInterfaces()
handler:代理类的方法里,要执行的操作
通常是增强目标对象的方法或控制目标对象的方法
是InvocationHandler接口的实现类,通常写成匿名内部类形式
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//proxy:代理对象的引用,通常不用
//method:调用的方法对象
//args:调用的方法的参数
//result:调用代理对象时的返回值
return result;
}
}
cglib的动态代理是基于子类的动态代理,不需要目标对象实现接口,要求被代理类不能由final修饰.核心API是cglib.proxy.Enhancer
类的create
方法
Enhancer.create(目标对象.getClass(), new MethodInterceptor() {
/**
* @param proxy:代理对象引用
* @param method:目标对象方法(通过它可以访问目标对象)
* @param args:传递给目标对象的参数
* @MethodProxy methodProxy:代理对象的方法
* @return 返回值
* @throws Throwable
*/
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
//功能代码
return result;
}
});
返回值:目标类的子类对象
参数:
标签:create 动态代理 动态 实现类 接口 字节 控制 object 匿名内部类
原文地址:https://www.cnblogs.com/story-xc/p/10989385.html