JavaダイナミックエージェントのCGLIB
6142 ワード
JavaダイナミックエージェントのCGLIB
概要
Cglibは優れた動的エージェントフレームワークであり、その下位層はASMを使用してメモリ内で被エージェントクラスのサブクラスを動的に生成する.CGLIBを使用すると、エージェントクラスによってインタフェースが実装されていなくても動的エージェント機能を実現することができる.CGLIBは簡単で使いやすく、JDKのProxyダイナミックエージェントよりもはるかに高速に動作します.
CGLIBのコアクラス:
net.sf.cglib.proxy.Enhancer–主な強化クラス
net.sf.cglib.proxy.MethodInterceptor–Callbackインタフェースのサブインタフェースであり、ユーザーが実装する必要があるクラスをブロックする主な方法
net.sf.cglib.proxy.MethodProxy–JDKのjava.lang.reflect.Methodクラスのエージェントクラスは、次のようなソース・オブジェクト・メソッドの呼び出しを容易に行うことができます.
Object o = methodProxy.invokeSuper(proxy, args);//最初のパラメータは被エージェントオブジェクトですが、デッドループの問題は発生しません.
インスタンスの使用
プロキシ対象クラス:
エージェントクラスの実装:
テストクラス:
出力:
概要
Cglibは優れた動的エージェントフレームワークであり、その下位層はASMを使用してメモリ内で被エージェントクラスのサブクラスを動的に生成する.CGLIBを使用すると、エージェントクラスによってインタフェースが実装されていなくても動的エージェント機能を実現することができる.CGLIBは簡単で使いやすく、JDKのProxyダイナミックエージェントよりもはるかに高速に動作します.
CGLIBのコアクラス:
net.sf.cglib.proxy.Enhancer–主な強化クラス
net.sf.cglib.proxy.MethodInterceptor–Callbackインタフェースのサブインタフェースであり、ユーザーが実装する必要があるクラスをブロックする主な方法
net.sf.cglib.proxy.MethodProxy–JDKのjava.lang.reflect.Methodクラスのエージェントクラスは、次のようなソース・オブジェクト・メソッドの呼び出しを容易に行うことができます.
Object o = methodProxy.invokeSuper(proxy, args);//最初のパラメータは被エージェントオブジェクトですが、デッドループの問題は発生しません.
インスタンスの使用
プロキシ対象クラス:
package cglib;
/*
*
*/
public class Target {
public void say(String string) {
System.out.println("Target.say()");
System.out.println(string);
}
}
エージェントクラスの実装:
package cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class ProxyTest implements MethodInterceptor {
@Override
/*
* (non-Javadoc)
* @see net.sf.cglib.proxy.MethodInterceptor#intercept(java.lang.Object, java.lang.reflect.Method, java.lang.Object[], net.sf.cglib.proxy.MethodProxy)
*
* ;
Method ;
;
MethodProxy , cglib Method , MethodProxy JDK Method
*/
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
System.out.println("bofore");
/*
* invokeSuper() , , invokeSuper 。
*/
Object object = arg3.invokeSuper(arg0, arg2);
System.out.println("after");
return "hahah";
}
}
テストクラス:
package cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class ProxyTest implements MethodInterceptor {
@Override
/*
* (non-Javadoc)
* @see net.sf.cglib.proxy.MethodInterceptor#intercept(java.lang.Object, java.lang.reflect.Method, java.lang.Object[], net.sf.cglib.proxy.MethodProxy)
*
* ;
Method ;
;
MethodProxy , cglib Method , MethodProxy JDK Method
*/
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
System.out.println("bofore");
/*
* invokeSuper() , , invokeSuper 。
*/
Object object = arg3.invokeSuper(arg0, arg2);
System.out.println("after");
return "hahah";
}
}
出力:
bofore
Target.say()
aaaa
after