クラスファイルの中身を調べる
これだけでは本当にクラスファイルが修正されているのかちょっと不安だ、という人もいることでしょう。実際に変更されているのか、TestBean.classをデコンパイルしてみました(デコンパイルに使用したのはjadです。jadについては[禁断の必殺技?「デコンパイラ」を使う]を参照ください)。以下がTestBean.classから生成されたソースコードです。
package jp.tuyano.jasample;
import java.io.PrintStream;
public class TestBean
{
public String testfield;
int addfield;
public TestBean()
{
testfield = "helo";
}
public void test()
{
System.out.println(testfield);
}
public void addmethod()
{
System.out.println("add this method.");
}
}
元の状態のTestBeanはどうなっていたか?というと、以下のようになっています。これも、TestBean.classからデコンパイルで生成したものです。
package jp.tuyano.jasample;
import java.io.PrintStream;
public class TestBean
{
public String testfield;
public TestBean()
{
testfield = "helo";
}
public void test()
{
System.out.println(testfield);
}
}
確かに、addfieldとaddmethodがプログラム実行後のTestBean.classに追加されていることがわかります。実に簡単にクラスが操作できてしまうでしょう?
若干、ソースコードが元のクラスと違っているのは、Javaのコンパイラがコンパイルする際にソースコードを若干改変しているためです。java.io.PrintStreamがimportされていたり、フィールドへの値の代入がコンストラクタで行なわれていたりするのはこのためで、Javassistによる変換とは関係ありません。元のクラスでもこれらは含まれていますからわかりますね。