作成 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