使用cglib代理对象,增强目标点 getInstance()方法获得目标对象的代理对象,intercept()为增强面 下面是我使用过的一个例子
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* GlobalConfigEntityProxy
* @author created by vinson on 2019/2/28
*/
public class ConfigLockProxy implements MethodInterceptor {
private static final String INTERCEPTOR_METHOD_PREFIX = "get";
/** 业务类对象,供代理方法中进行真正的业务方法调用 \*\*/
private Object target;
/**
* 相当于JDK动态代理中的绑定
* @author created by vinson on 2019/2/28
*/
Object getInstance(ConfigLock target) {
//给业务对象赋值
this.target = target;
//创建加强器,用来创建动态代理类
Enhancer enhancer = new Enhancer();
//为加强器指定要代理的业务类(即:为下面生成的代理类指定父类)
enhancer.setSuperclass(this.target.getClass());
//设置回调:对于代理类上所有方法的调用,都会调用CallBack,而Callback则需要实现intercept()方法进行拦
enhancer.setCallback(this);
//构造方法不拦截
enhancer.setInterceptDuringConstruction(false);
// 创建动态代理类对象并返回
return enhancer.create();
}
/**
* 实现回调方法
* @author created by vinson on 2019/2/28
*/
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
//拦截get方法
if (method.getName().startsWith(INTERCEPTOR_METHOD_PREFIX)) {
((ConfigLock) obj).readyRead();
}
//调用业务类(父类中)的方法
return proxy.invokeSuper(obj, args);
}
}