2

ロードされたクラスをファイルに保存することはできますか?

Class cc = Class.forName("projects.implementation.JBean");

または、そのクラスの物理的な場所を取得するためでしょうか?

4

2 に答える 2

1

はい、 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();
        }

    }
    }
于 2012-11-18T09:49:35.067 に答える
0

JavaでClassオブジェクトをシリアル化すると、クラスの修飾名だけがシリアル化されます。デシリアライズするとき、クラスは名前で検索されます。

一般的なケースでは、クラス定義に対応するバイト(バイトコード)がロードされた後は、それを取得することはできないと思います。Javaでは、実行時にクラスを定義することが許可されており、私が知る限り、クラスがロードされた後はバイトを公開しません。

ただし、使用しているClassLoaderによっては、次のことがわかる場合があります。

cc.getResourceAsStream("JBean.class")

必要なのは、独自のClassLoaderを使用してクラスストリームをリソースとしてロードすることだけです。

別のオプションは、クラスのロードをインターセプトすることです。ClassLoaderは「defineClass」のバイトを確認できるため、カスタムClassLoaderはそれらをどこかに格納できます。

于 2012-11-18T14:12:52.353 に答える