cglib代理- 通过继承的方式实现代理类
- MethodInterceptor :通过
MethodProxy.invokeSuper()
反射调用目标对象的方法
代码实现:
1、创建接口
package jdk;
public interface Subject {
void request();
void hello();
}
2、创建目标对象
package jdk;
/**
* @author :panda
* 目标对象
*/
public class RealSubject implements Subject {
public void request() {
System.out.println("real subject execute request..");
}
public void hello() {
System.out.println("real subject execute hello..");
}
}
3、创建代理对象
package cglib;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibProxyInterceptor implements MethodInterceptor {
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println(" before in cglib..");
Object result = null;
try {
//通过反射调用目标对象方法
result = methodProxy.invokeSuper(o, objects);
} catch (Exception e) {
System.out.println("get ex:" + e.getMessage());
throw e;
} finally {
System.out.println("after in cglib..");
}
return result;
}
}
4、客户端
package cglib;
import jdk.*;
import net.sf.cglib.proxy.Enhancer;
public class Client {
public static void main(String[] args) {
//保存字节码文件到本地
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\cglibCode");
Enhancer enhancer = new Enhancer();
//生成指定类对象的子类,也就是重写类中的业务函数
enhancer.setSuperclass(RealSubject.class);
//这里是回调函数,加入intercept()函数
enhancer.setCallback(new CglibProxyInterceptor());
//创建这个子类对象
Subject subject =(Subject) enhancer.create();
subject.hello();
subject.request();
}
}
4、输出
5、生成的字节码文件
可以看到代理类继承了目标对象,cglib代理对象是目标对象的子类
1、每个代理对象的方法都生成了两个 final 类型得方法
2、目标对象中final修饰的方法、private方法不能被代理
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package jdk;
import java.lang.reflect.Method;
import net.sf.cglib.core.ReflectUtils;
import net.sf.cglib.core.Signature;
import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Factory;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class RealSubject$$EnhancerByCGLIB$$8663f43f extends RealSubject implements Factory {
private boolean CGLIB$BOUND;
public static Object CGLIB$FACTORY_DATA;
private static final ThreadLocal CGLIB$THREAD_CALLBACKS;
private static final Callback[] CGLIB$STATIC_CAL