谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

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の問題かも知れません。


もう少し調べてみるか、作者に泣きついてみるか、してみます。