CGLIBにさわる

作成 2004/9/10

CGLIBにさわってみたメモ。ちょっとだけ。

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です。

はじめてのCGLIB

とりあえず、サンプルをまねて作ってみたのがこれ。

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


Top