私の質問は、特定の .class ファイルから java.lang.Class のインスタンスを取得する方法です。ファイル MyClass.class と対応する java.io.File インスタンスがある場合、これを使用して MyClass に対応する java.lang.Class のインスタンスを取得するにはどうすればよいでしょうか。
2 に答える
Class<?> clazz = new URLClassLoader(new File("").toURL()).loadClass(className);
これを行うには、実際にはクラスローダが必要です (バイトコードのバイトストリームをクラスに変換するため)。ここにはいくつかのオプションがあります。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);
これがあなたを正しい方向に導くことを願っています(!)