新しいURLClassLoader (「デフォルト」の Java クラスローダー) を作成し、ファイルを保存した場所をポイントします。
// the directory where you're saving the .class file
File tmpDir = new File("/tmp/yadda/blah/");
ClassLoader cl = new URLClassLoader(new URL[] { tmpDir.toURI().toURL() }, Thread.currentThread().getContextClassLoader());
Class<?> cls = cl.loadClass("SuperSecretClass");
// use reflection to instantiate cls, call methods, etc.
(親クラスローダーを渡すことは、非 webapp では必要ないかもしれませんが、私はその詳細をテストするのが面倒です。スレッドのクラスローダーを明示的に使用すると、いずれかの方法で機能します。
これは、シークレット クラスがパッケージに含まれていないことを前提としています。パッケージに含まれている場合は、一時ディレクトリ内に適切なディレクトリ構造を作成し、通常どおりパッケージ ツリーのルートにクラスローダーを指定する必要があります。
また、この種のあいまいさによるセキュリティは、悪い考えのように思えます。セキュリティで保護されていない接続を介している場合、断固とした攻撃者がファイルを盗聴する可能性があり、ファイルがディスク上にある期間がまだあります。ストリームを直接読み取る完全なカスタムを作成することもできClassLoader
ますが、クラス ファイルでさえ、もう少し努力すれば復元できる可能性があります。(デバッガーをメインアプリに向けてストリームの読み取りをインターセプトするようなものです。) のjavadocClassLoader
は、これを行う方法の例を提供します。