当需要代理没有任何接口的类时,动态代理无法实现该功能。此时需要借助CGLib来代理没有接口的类。
public class CGLibProxy implements MethodInterceptor{
public <T> T getProxy(Class<T> cls) {
return (T) Enhancer.create(cls,this);
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
before();
Object result = methodProxy.invokeSuper(o, objects);
after();
return result;
}
private void before() {
System.out.println("before...");
}
private void after() {
System.out.println("after...");
}
public static void main(String[] args) {
CGLibProxy cgLibProxy = new CGLibProxy();
Hello helloProxy = cgLibProxy.getProxy(HelloImpl.class);
helloProxy.say("Jack");
}
}
实现CGLib提供给我们的MethodInterceptor的intercept方法,实质上可以将此理解为方法层面的拦截器。
网友评论