Aspect指向と組み合わせると面白そうってことでさくっとやってみた。
とりあえず使ってみたものは、以下の4つだ!
- ClassPool
- CtClass
- CtMethod
- CtNewMethod
手順
- ClassPool.getDefaultでClassPoolゲット
- ClassPool#makeClass
- CtNewMethod.make
- CtClass#addMethod
あたりでクラス作ってメソッドを追加できる。
とりあえず実験!
下のようなインターフェイスを用意
package org.okazuki.javassist.hello; public interface SayHello { void execute(); }
んでmainで、これの実装クラスを作ってインスタンス作ってメソッド呼ぶ!
package org.okazuki.javassist.hello; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import javassist.CtNewMethod; public class HelloWorld { public static void main(String[] args) throws Exception { ClassPool pool = ClassPool.getDefault(); CtClass cc = pool.makeClass("org.okazuki.javassist.hello.SayHelloImpl"); CtMethod cm = CtNewMethod.make("public void execute() {System.out.println(\"Hello world\");}", cc); cc.addMethod(cm); cc.addInterface(pool.get(SayHello.class.getName())); SayHello hello = (SayHello) cc.toClass().newInstance(); hello.execute(); } }
実行してみると…
Hello world
出た出た!!
満足ですじゃ。