0

私の質問は、特定の .class ファイルから java.lang.Class のインスタンスを取得する方法です。ファイル MyClass.class と対応する java.io.File インスタンスがある場合、これを使用して MyClass に対応する java.lang.Class のインスタンスを取得するにはどうすればよいでしょうか。

4

2 に答える 2

0

Class<?> clazz = new URLClassLoader(new File("").toURL()).loadClass(className);

于 2012-05-16T16:26:57.933 に答える
0

これを行うには、実際にはクラスローダが必要です (バイトコードのバイトストリームをクラスに変換するため)。ここにはいくつかのオプションがあります。1 つは、標準URLClassLoaderインスタンスを使用することですが、それは適切な Java パッケージの場所に配置されることに依存します (URLClassLoaderファイルが存在するファイル パスのルートに作成します。ただし、これはディレクトリ構造がミラーリングされている場合にのみ機能します)。ロードしようとしているクラス ファイルのパッケージ構造)。

最も簡単な基本クラスはSecureClassLoader、セキュリティ マネージャーが有効になっている JVM でコードを実行できるようにすることです (つまり、コード ベースを設定できます)。

あなたにとって重要な方法はfindClass、バイナリ名をクラスに変換する as です (クラス名とロードしているファイルの間で独自のマッピングを作成できます)。ファイルをロードし、ファイルのバイトを最も重要なメソッドに渡すことができます: defineClass. の方法ですSecureClassLoader。クラスのバイナリ名、ByteBufferおよびCodeSource(Java セキュリティ用)を取ります。

ファイルからバッファを作成するには、次を使用します。

FileInputStream fis = new FileInputStream(yourFileObj)
FileChannel channel = fis.getChannel();
ByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, clsFile.length());

CodeSource安全な環境で使用できるようにするには、次のようなものを使用する必要があり ます。

CodeSource cs = new CodeSource(clsFile.getParent().toURI().toURL(), (CodeSigner[]) null);

そして、

Class<?> aClass = super.defineClass(name, buffer, cs);

これがあなたを正しい方向に導くことを願っています(!)

于 2012-05-16T17:08:44.307 に答える