かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

ばいとこーどえんじにありんぐ?

Aspect指向と組み合わせると面白そうってことでさくっとやってみた。

とりあえず使ってみたものは、以下の4つだ!

  • ClassPool
  • CtClass
  • CtMethod
  • CtNewMethod

手順

  1. ClassPool.getDefaultでClassPoolゲット
  2. ClassPool#makeClass
  3. CtNewMethod.make
  4. 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

出た出た!!
満足ですじゃ。