首页 > IT职业 > IT职场 > Java代理模式之CGLIB动态代理
前面我们了解了JDK动态代理技术,发现其真实对象必须提供接口才可以使用。在一些不提供接口的环境中,只能采用一些别的第三方技术,比如CGLIB动态代理。它的有事在于不需要提供接口,只要一个非抽象类就可以实现动态代理。
实现代理逻辑的类需要实现net.sf.cglib.proxy.MethodInterceptor接口
下面示例的具体代码可到cglib动态代理中下载。
实验需要引入CGLIB jar包
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2.2</version> </dependency>
【真实对象类】
public class HelloGod {
private String name; public HelloGod(String name){ this.name = name;
} public void helloGod(){
System.out.println("hello " + name);
}
}
【动态代理绑定和代理逻辑实现】
import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class CglibProxyExample implements MethodInterceptor { /**
* @param cls Class类
* @return Class的CGLIB代理对象
*/
public Object getProxy(Class cls, Class[] argumentTypes, Object[] arguments){ //CGLIB enhancer增强类对象
Enhancer enhancer = new Enhancer(); //设置增强类型
enhancer.setSuperclass(cls); //定义代理对象为当前对象,要求当前对象实现MethodInterceptor方法
enhancer.setCallback(this); //生成并返回代理对象
return enhancer.create(argumentTypes ,arguments);
} /**
* @param proxy 代理对象
* @param method 方法
* @param args 方法参数
* @param methodProxy 方法代理
* @return 代理逻辑返回
* @throws Throwable 抛出异常
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.err.println("调用真实对象前"); //CGLIB反射调用真实对象方法
Object result = methodProxy.invokeSuper(proxy, args);
System.err.println("调用真实对象后"); return result;
}
}
【测试】
public class TestCglibProxy {
public static void main(String[] args) {
CglibProxyExample cglibProxyExample = new CglibProxyExample();
Class[] argumentTypes = new Class[]{String.class}; Object[] arguments = new Object[]{"baipengfei"};
HelloGod helloGod = (HelloGod) cglibProxyExample.getProxy(HelloGod.class, argumentTypes ,arguments);
helloGod.helloGod();
}
}
作者:写代码的白大侠
链接:https://www.jianshu.com/p/a1095fa9d6a2
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1769/viewspace-2816015/ ,如需转载,请注明出处,否则将追究法律责任。