了解什么是动态代理模式, 可参考 Java 设计模式之代理模式
简介
前面我们了解了 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();
- }
- }
来源: http://www.jianshu.com/p/a1095fa9d6a2