Posted on 2007-11-05 10:22
G_G 閱讀(5782)
評論(3) 編輯 收藏 所屬分類:
AOP
看hbn 源代碼 發現用了 CGlib 這就看看這個jar 。特留個文 ^_^(轉)http://www.nirvanastudio.org/java/cglib-%E6%8C%87%E5%8D%97.html
CGlib 就2個例能說明一切?
先是使用類? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
public?class?MyClass?{
?
????public?void?method()?{
????????System.out.println("MyClass.method()");
????}
????public?void?method2()?{
????????System.out.println("MyClass.method2()");
????}
}
例1:
import?java.lang.reflect.Method;
?
import?net.sf.cglib.proxy.Enhancer;
import?net.sf.cglib.proxy.MethodProxy;
import?net.sf.cglib.proxy.MethodInterceptor;
?
public?class?Main?{
?
????public?static?void?main(String[]?args)?{
?
????????Enhancer?enhancer?=?new?Enhancer();
??? ??
??? ??? //在這代理了
????????enhancer.setSuperclass(MyClass.class);
????????enhancer.setCallback(?new?MethodInterceptorImpl()?);
?
??????? // 創造 代理 (動態擴展了MyClass類)
????????MyClass?my?=?(MyClass)enhancer.create();
?
????????my.method();
????}
?
????private?static?class?MethodInterceptorImpl?implements?MethodInterceptor?{
????????
????????public?Object?intercept(Object?obj,?
????????????????????????????????Method?method,?
????????????????????????????????Object[]?args,?
????????????????????????????????MethodProxy?proxy)?throws?Throwable?{
?
????????????System.out.println(method);
?
????????????proxy.invokeSuper(obj,?args);
?
????????????return?null;
????????}
????}
}
例2:
import?java.lang.reflect.Method;
import?net.sf.cglib.proxy.Enhancer;
import?net.sf.cglib.proxy.MethodProxy;
import?net.sf.cglib.proxy.MethodInterceptor;
import?net.sf.cglib.proxy.NoOp;
import?net.sf.cglib.proxy.Callback;
import?net.sf.cglib.proxy.CallbackFilter;
?
?
public?class?Main2?{
?
????public?static?void?main(String[]?args)?{
?
????????Callback[]?callbacks?=
????????????new?Callback[]?{?new?MethodInterceptorImpl(),??NoOp.INSTANCE?};
?
????????Enhancer?enhancer?=?new?Enhancer();
?
????????enhancer.setSuperclass(MyClass.class);
????????enhancer.setCallbacks(?callbacks?);
??????? //添加 方法過濾器? 返回1為不運行 2 為運行
????????enhancer.setCallbackFilter(?new?CallbackFilterImpl()?);
?
?
????????MyClass?my?=?(MyClass)enhancer.create();
?
????????my.method();
????????my.method2();
????}
?
????private?static?class?CallbackFilterImpl?implements?CallbackFilter?{
?
????????public?int?accept(Method?method)?{
?
????????????if?(?method.getName().equals("method2")?)?{
????????????????return?1;
?
????????????}?else?{
????????????????return?0;
????????????}
????????}
????}
?
????private?static?class?MethodInterceptorImpl?implements?MethodInterceptor?{
????????
????????public?Object?intercept(Object?obj,?
????????????????????????????????Method?method,?
????????????????????????????????Object[]?args,?
????????????????????????????????MethodProxy?proxy)?throws?Throwable?{
?
????????????System.out.println(method);
?
????????????return?proxy.invokeSuper(obj,?args);
????????}
????}
}
簡單不 哈哈 比jdk 中的動態代理好用 ,那還要接口? 不太方便 。