作成 2004/9/10
CGLIBにさわってみたメモ。ちょっとだけ。
CGLIBとは、Javaコード生成ライブラリです。クラスファイルを実行時に読み込んで編集することが可能です(Javassistと同じジャンル)。CGLIBは、Hibernate、iBatisなどのDBアクセスツールや、Spring、SeasorなどのAOPコンテナなどで利用されています。
CGLIBのWebページ
http://cglib.sourceforge.net/
CGLIBのWebページのDownloadsからCGLIBをダウンロードします。ここでは、最新リリースのcglib-full-2.0.2.jarをダウンロードしました。バイナリにfullとそうでないのがありますが、CGLIBは内部でASM(http://asm.objectweb.org/)を利用しており、fullはASMを含んだモジュールです。
CGLIBを利用するにはダウンロードしたJARファイルをクラスパスに通せばOKです。
とりあえず、サンプルをまねて作ってみたのがこれ。
Foo.java
package hoge;
public class Foo {
public void doSomething(){
System.out.println("doSomethig");
}
}
Sample1.java
package hoge;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class Sample1 {
public static void main(String[] args) throws Exception{
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Foo.class);
enhancer.setCallback(new MyMethodIntercepter());
Foo foo = (Foo)enhancer.create();
foo.doSomething();
}
}
class MyMethodIntercepter implements MethodInterceptor{
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("before");
return proxy.invokeSuper(obj, args);
}
}
実行結果
before doSomethig
Enhancerというクラスを利用してサブクラスを作り、setCallback()で差込みを行うようです。
なんかQuick Startとかそういうマニュアルないですね。ソース見て作れみたいな、オープンソース的(?)で素敵。気が向いたらもうちょっと調べます。
cglib メモ
http://www.ncfreak.com/asato/doc/cglib.html