Javaでサンプルコードを作成するとき、私はClassCastExceptionを見つけました。そこからStaticClassにオブジェクトをキャストしました。誰がここで何が起こったのか説明できますか?そのクラスがロードされているオブジェクトの参照を作成するときは?
public void test5() throws Exception {
System.out.println(StaticClass.obj);
Object newInstance = ClassLoader.getSystemClassLoader().loadClass("com.StaticClass").newInstance();
System.out.println(newInstance.getClass().getDeclaredField("obj").get(newInstance));
Object newInstance2 = new ILoader().loadClass("com//StaticClass.class").newInstance();
System.out.println(newInstance2.getClass().getDeclaredField("obj").get(newInstance2));
StaticClass s = (StaticClass)newInstance2;
System.out.println(s.obj);
System.out.println(newInstance.getClass().getClassLoader());
System.out.println(newInstance2.getClass().getClassLoader());
}
package com;
public class StaticClass {
public static final Object obj = new Object();
}
package com;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class ILoader extends ClassLoader {
public ILoader() {
super(null);
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
File file = new File(name);
byte[] bytes = new byte[(int)file.length()];
try {
new FileInputStream(file).read(bytes);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return super.defineClass("com.StaticClass",bytes, 0, bytes.length);
}
}
コードの鋳造部分が存在しない場合、最後のSystem.outによって与えられた出力は、以下の通りです。
[email protected]
[email protected]
なぜダブルスラッシュ? com // StaticClass.class、クラスローダーはクラス名の最後に.classを期待しません。 – MeBigFatGuy
@MeBigFatGuy:私はasela38というクラスファイルへの相対パスが、ILoaderクラスで同じものを読み込んでいると思います。 – Favonius
これはクラスの場所なので、classLoaderはロードすることができます。ここで私はカスタムClassLoader を使用しています(ここでは2つの別々のClassLoaderからロードされたクラスStaticClassの2つのインスタンスが存在します) .misc.Launcher $ AppClassLoader(java.class.pathからクラスをロードする))) – asela38