ロードされたクラスをファイルに保存することはできますか?
Class cc = Class.forName("projects.implementation.JBean");
または、そのクラスの物理的な場所を取得するためでしょうか?
ロードされたクラスをファイルに保存することはできますか?
Class cc = Class.forName("projects.implementation.JBean");
または、そのクラスの物理的な場所を取得するためでしょうか?
はい、 Class.class がSerializable
インターフェイスを実装しているため、それをファイルにシリアル化し、再度逆シリアル化することができます。
例 -
Class Test{
public static void main(String[] args) throws ClassNotFoundException {
try {
OutputStream file = new FileOutputStream("test.ser");
OutputStream buffer = new BufferedOutputStream(file);
ObjectOutput output = new ObjectOutputStream(buffer);
try {
Class cc = Class.forName("com.test.Test");
System.out.println(cc);
output.writeObject(cc);
} finally {
output.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
try {
// use buffering
InputStream file = new FileInputStream("test.ser");
InputStream buffer = new BufferedInputStream(file);
ObjectInput input = new ObjectInputStream(buffer);
try {
// deserialize the class
Class cc = (Class) input
.readObject();
// display
System.out.println("Recovered Class: " + cc);
} finally {
input.close();
}
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
JavaでClassオブジェクトをシリアル化すると、クラスの修飾名だけがシリアル化されます。デシリアライズするとき、クラスは名前で検索されます。
一般的なケースでは、クラス定義に対応するバイト(バイトコード)がロードされた後は、それを取得することはできないと思います。Javaでは、実行時にクラスを定義することが許可されており、私が知る限り、クラスがロードされた後はバイトを公開しません。
ただし、使用しているClassLoaderによっては、次のことがわかる場合があります。
cc.getResourceAsStream("JBean.class")
必要なのは、独自のClassLoaderを使用してクラスストリームをリソースとしてロードすることだけです。
別のオプションは、クラスのロードをインターセプトすることです。ClassLoaderは「defineClass」のバイトを確認できるため、カスタムClassLoaderはそれらをどこかに格納できます。