かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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

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

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