这里简单的对CGLIB动态代理做一个实现例子
业务场景说明:
张三需要找一个肤白貌美的伴侣(被代理类),但是这个事情他自己办不到需要交给媒婆去帮助办理(代理类)
代码示例
- Zhangsan.java 被代理类
package com.leitan.architect.pattern.proxy.cglib;
/**
* @Author: tan.lei
* @Date: 2018-10-17 15:59
*/
public class Zhangsan {
/**
* 业务类的方法
*/
public void findPatner() {
System.out.println("需要清新小文艺的伴侣");
}
}
- CglibMeipo.java 代理类
package com.leitan.architect.pattern.proxy.cglib;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* @Author: tan.lei
* @Date: 2018-10-17 15:58
*/
public class CglibMeipo implements MethodInterceptor {
public Object getInstance(Class<?> clazz) {
Enhancer enhancer = new Enhancer();
// 把被代理类设为代理类的父类
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
// 业务的增强
System.out.println("媒婆:请给我你的需求,开始帮你物色....");
methodProxy.invokeSuper(o, objects);
System.out.println("如果找到符合要求的就安排给你....");
return null;
}
}
- 测试类
package com.leitan.architect.pattern.proxy.cglib;
/**
* @Author: tan.lei
* @Date: 2018-10-17 16:11
*/
public class CglibTest {
public static void main(String[] args) {
try {
Zhangsan obj = (Zhangsan) new CglibMeipo().getInstance(Zhangsan.class);
obj.findPatner();
System.out.println(obj.getClass());
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试结果:
媒婆:请给我你的需求,开始帮你物色…
需要清新小文艺的伴侣
如果找到符合要求的就安排给你…
class com.leitan.architect.pattern.proxy.cglib.Zhangsan E n h a n c e r B y C G L I B EnhancerByCGLIB EnhancerByCGLIB47819f6bProcess finished with exit code 0
实现了动态代理的需求,不像JDK的动态代理需要接口间接实现,更加简洁易用
另一篇手写JDK动态代理可以参见手写JDK动态代理