BTraceの制限事項
BTraceは、メソッドのIn/Outや、エラー発生時、あるいは定期実行など
いくつかのタイミングで、処理を埋め込む事ができる、とても便利なツールです。
しかも流行りの(しかしググっても全然ヒットしない)オンデマンドアタッチと
BCIを使っているので、アプリケーションの起動中に、ソースを改変せずに、
処理を埋め込むことができるスグレモノです。
そんなBTraceですが、安全性を高めるためなのか、かなりの制限事項があります。
BTrace User's Guideにも書いている制限事項を訳しておきましょう。
- オブジェクトの生成ができない。
- 配列の生成ができない。
- 例外をスローできない。
- 例外をキャッチできない。
- 任意のインスタンスメソッドやstaticメソッドの呼び出しができない(BTraceUtilsを除く)
- 埋め込み対象クラスのクラス変数や、オブジェクトのインスタンス変数に値を代入できない。
- ただしBTraceクラス自身のstaticフィールドには代入可能。
- インスタンス変数や、インスタンスメソッドは作成できない。
- static public voidメソッドだけ作成できる。
- 変数は全てstatic。
- 外部クラス、内部クラス、ローカルクラスは作成できない。
- synchronizedブロックやメソッドは作成できない。
- ループ(for、while、do〜while)は利用できない。
- 任意のクラスをextendsして作成することはできない。super classはjava.lang.Objectのみ。
- interfaceをimplementsすることはできない。
- assert文を利用することはできない。
- クラスリテラル(Hoge.class)は利用できない。
ビックリするほど制限だらけです。
実際に破ったらどうなるのでしょうか、試してみましょう。
import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.*; @BTrace public class HelloWorld { @OnMethod( clazz="tutorial.action.EmployeeAction", method="edit" ) public static void func() { File file = new File(); println("about to start editing!"); } }
import文すら書かない手の抜きようですが、これで動かしてみましょう。
C:\Work>jps 7940 Jps 3940 Bootstrap C:\Work>btrace 3940 HelloWorld.java エラー:HelloWorld.java:18:object creation is not allowed BTrace compilation failed
コンパイルに失敗したようです。
import云々以前に、newという単語に引っ掛かっているようですね。
その後も色々試してみたところ、
- ○ : String str1 = "Hoge";
- × : String str2 = new String("Hoge");
- ○ : Integer i = 5;
- × : Integer j = Integer.valueOf(5);
- × : Integer k = new Integer(5);
- ○ : Boolean b = Boolean.TRUE;
という状態でした。
安定動作させるための制限なのか、
あるいは内部実装による制限なのかは分からないのですが、
いずれにせよ、BTraceクラスにはこうした強い制限があります。
HelloWorld.classを作成した後に、強引に書き換えたらどうなるんだろう、
なんて興味は尽きなかったりもしますが、そういう楽しみは残しておきましょう。