1.cglib基本概念
Cglib 代理,也叫作子类代理,它是在内存中构建一个子类对象从而实现对目
标对象功能的扩展.CGLib采用了非常底层的字节码技术,其原理是通过字节码
技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的
调用,顺势织入横切逻辑。但因为采用的是继承,所以不能对 final
修饰的类进行代理。JDK 动态代理与 CGLib 动态代理均是实现 Spring AOP
的基础。
2.cglib示范案列
https://www.cnblogs.com/monkey0307/p/8328821.html
public class PersonService {
public PersonService() {
System.out.println("PersonService构造");
}
//该方法不能被子类覆盖
final public Person getPerson(String code) {
System.out.println("PersonService:getPerson>>"+code);
return null;
}
public void setPerson() {
System.out.println("PersonService:setPerson");
}
}
public class CglibProxyIntercepter implements MethodInterceptor {
@Override
public Object intercept(Object sub, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("执行前...");
Object object = methodProxy.invokeSuper(sub, objects);
System.out.println("执行后...");
return object;
}
}
public class Test {
public static void main(String[] args) { //代理类class文件存入本地磁盘
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\code");
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(PersonService.class);
enhancer.setCallback(new CglibProxyIntercepter());
PersonService proxy= (PersonService) enhancer.create(); proxy.setPerson(); proxy.getPerson("1");
}
}
执行前...
PersonService:setPerson
执行后...
PersonService:getPerson>>1
3.jdk示范案例
public class ProxyFactory implements InvocationHandler {
private Class target;
public <T>T getProxy(Class<T> c) {
this.target = c;
return (T)Proxy.newProxyInstance(c.getClassLoader(),c.isInterface()?new Class[]{c}:c.getInterfaces(),this);
}
@Override
public Object invoke(Object proxy , Method method , Object[] args) throws Throwable {
System.out.println("代理执行执行");
if ( !target.isInterface() ){
method.invoke(target.newInstance(),args);
}
return "代理返回值";
}
public static void main(String[] args) {
// 保存生成的代理类的字节码文件
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
ProxyFactory proxyFactory = new ProxyFactory();
IProx proxyImpl = proxyFactory.getProxy(ProxImpl.class);
String result = proxyImpl.hello("hello word");
System.out.println(result);
System.out.println("---------");
IProx proxy = proxyFactory.getProxy(IProx.class);
result = proxy.hello("hello word");
System.out.println(result);
}
}
interface IProx{
String hello(String id);
}
class ProxImpl implements IProx{
@Override
public String hello(String id) {
System.out.println(id);
return null;
}
}