pom.xml
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
</dependency>
声明被代理的类
public <T> T createCglibProxy(Class<T> clazz) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(clazz); //声明被代理的类
enhancer.setCallback(MyCglibProxy.instance或者new MethodInterceptor()的实现类);//处理拦截代理类的逻辑
Object o = enhancer.create();
return (T)o;
}
拦截被代理类的逻辑
public class MyCglibProxy implements MethodInterceptor
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
Object result = null;
String methodName = method.getName();
System.out.println("The method name="+methodName);
//过滤各种方法名
// Xxxx xxx = filterMethodName(methodName);//
try {
System.out.println("aop start");
result = proxy.invokeSuper(obj, args);
System.out.println("aop end");
} catch (Exception e) {
throw e;
}
return result;
}
下面是一个完整的例子
通用的代理类MyCglibProxy
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public enum MyCglibProxy implements MethodInterceptor {
instance;
public <T> T createCglibProxy(Class<T> clazz) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(clazz);
enhancer.setCallback(MyCglibProxy.instance);
//或者 enhancer.setCallback(this);
Object o = enhancer.create();
return (T)o;
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
Object result = null;
String methodName = method.getName();
System.out.println("The method name="+methodName);
//过滤各种方法名
// Xxxx xxx = filterMethodName(methodName);//
try {
System.out.println("aop start");
result = proxy.invokeSuper(obj, args);
System.out.println("aop end");
} catch (Exception e) {
throw e;
}
return result;
}
}
具体的使用细节
public class MyMain {
public static void main(String[] args) {
MyHandler myHandler = MyCglibProxy.instance.createCglibProxy(MyHandler.class);
myHandler.aaa();
}
}
被代理的类
public class MyHandler {
public void aaa() {
System.out.println("aaaa");
}
}