Top / cglibを使って動的コード生成
jparsecみてたら、動的ソースコード生成のライブラリ使っており興味が湧いたのでまとめてみる
SpringやらHibernateなんかに内部的に使われているライブラリーらしい。
メソッド実行の前後に処理をフックをかけるというか差し込む技がつかわれています。
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()で差込みを行うようです。