在Spring項目中進行簡單的cglib動態代理的學習測試,主要代碼如下: 一個目標類HaveDinnerService public class HaveDinnerService { public String eat(String food) { System.out.println("開始吃 ...
在Spring項目中進行簡單的cglib動態代理的學習測試,主要代碼如下:
一個目標類HaveDinnerService
public class HaveDinnerService {
public String eat(String food) {
System.out.println("開始吃" + food + "=========================");
return food;
}
}
自定義的MethodInterceptor方法攔截器
public class MyMethodInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("準備吃晚飯了");
Object result = methodProxy.invokeSuper(o, objects);
System.out.println(result.toString() + "真好吃啊");
return result;
}
}
獲取代理增強類的工廠
public class CglibProxyFactory {
public static Object getProxy(Class clazz) {
Enhancer enhancer = new Enhancer();
enhancer.setClassLoader(clazz.getClassLoader());
enhancer.setSuperclass(clazz);
enhancer.setCallback(new MyMethodInterceptor());
return enhancer.create();
}
}
測試類
public class CglibMain {
public static void main(String[] args) {
HaveDinnerService haveDinnerService = (HaveDinnerService) CglibProxyFactory.getProxy(HaveDinnerService.class);
haveDinnerService.eat("龍蝦");
}
}
百度的解決辦法有刪除cglib的jar包重新導入的,有乾脆刪掉cglib導入asm的,但在瀏覽的過程中發現,spring已經將cglib集成到自己的jar包中,於是瞅了一眼引的包,發現
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.proxy.Enhancer;
項目中都是引的net.sf.cglib下的類,於是把這些引用刪掉,重新導包,發現
果斷換成springframework,問題解決