dumpしたクラスファイルをClassLoadしてみた。
btraceのdumpオプションを有効にして出力した.classファイルを
Javaでクラスロードしてみました。
import java.io.File; import java.io.FileInputStream; public class LoadClass { public static void main(String[] args) throws Exception { File file = new File("C:/Work/jdbcConnection.class"); FileInputStream in = new FileInputStream(file); final byte[] bytes = new byte[(int) file.length()]; in.read(bytes); in.close(); ClassLoader cl = new ClassLoader() { @Override protected Class<?> findClass(String name) throws ClassNotFoundException { return defineClass(null, bytes, 0, bytes.length); } }; Class<?> expClass = cl.loadClass("org.hsqldb.jdbc.jdbcConnection"); System.out.println(expClass); } }
これで実際に動かしてみたところ、やはりエラーが発生します。
Exception in thread "main" java.lang.ClassFormatError: Illegal class name "Ljava/lang/Object;" in class file <Unknown> at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:620) at java.lang.ClassLoader.defineClass(ClassLoader.java:465) at LoadClass$1.findClass(LoadClass.java:37) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at java.lang.ClassLoader.loadClass(ClassLoader.java:251) at LoadClass.main(LoadClass.java:41)
これは、
http://d.hatena.ne.jp/cero-t/20080621/1214055837
で出力されていた例外と全く同じです。
また、
http://d.hatena.ne.jp/cero-t/20080621/1214107938
で動いていたクラスでも、同じ例外が出ました。
(このクラスにjavapしても例外が出ます)
ただし、hsqldb-1.8.0.1.jarを解凍してできた
同じクラスファイルでは、例外は出ず、正常に読み込めます。
、、、はは〜ん、
つまり、BTraceで処理の埋め込みを行なったクラスは、
一見正常に動いているように見えるものの、
クラスとしてのバイナリは正しくないために
クラスロード時には問題が発生する、という事でしょうか。
その仮説通りであれば、
Hot Deployとの組み合わせで、上手く動くはずがありません。
ただ、これはBTrace側の問題のように思います。
あるいは、内部で使っているObjectWeb ASMの問題かも知れません。
もう少し調べてみるか、作者に泣きついてみるか、してみます。