2012-03-23 7 views
1

私は多くの暗号化されたクラスローダーを見てきました。以下のような:URLClassLoader - 暗号化されたJarを使用

http://www.javaworld.com/javaworld/javaqa/2003-05/01-qa-0509-jcrypt.html?page=2

1は、具体的には、私は私のニーズに適応しようとしているものであること。

私は基本的に、私がバイト配列( "byte [] decrypt;)"に復号化した暗号化されたJARを持っています。

バイト配列を使用してクラスをロードしたいので、暗号化されたjarを含むハードドライブにファイルを作成する必要はありません。

ClassLoaderが必要とする別の配列( "URL [] urls")があるので、URLClassLoaderを使用し、ClassLoaderを使用する必要はありません。 (通常のクラスローダーでこれを行うことはできますか?)

アイデアはありますか?

答えて

1

これはSOポストこれにかなり似ているようだ:

Load a Byte Array into a Memory Class Loader

私はここでの唯一の変更は、親クラスローダを利用することだと思う - ので、あなたのカスタムクラスローダのインスタンスを作成するときに、パスコンストラクタへのURLClassLoaderで

public class MyClassLoader extends ClassLoader { 
    public MyClassLoader(URLClassLoader parent, byte[] decryptedBytes) { 
    super(parent); 
    this.decryptedBytes = decryptedBytes; 
    } 

    protected byte[] decryptedBytes; 

    public Class findClass(String name) { 
    byte[] b = loadClassData(name); 
    if (b != null) { 
     return defineClass(name, b, 0, b.length); 
    } else { 
     // delegate to parent URL classloader 
     getParent().findClass(name); 
    } 
    } 

    private byte[] loadClassData(String name) { 
    // load the class data from the connection 
    // use JarInputStream, find class, load bytes ... 
    . . . 
    } 
} 
+0

これは類似しているが全く同じではない! :P古いものは、私がやっていたことをかなり完璧に処理しました。今回私はそれをメモリにロードする必要があります。また、この1つは、扱い - ちょっと! Chrisに感謝します。 - 1つの問題はgetParent()。findClassメソッドです.UrlClassLoaderが見つからないようで、代わりにClassLoaderを使用しています。 (私自身のgetParent()メソッドを作ることができない限り) –

+0

getParentはURLClassLoader(ClassLoaderを継承します)を返します。必要に応じてキャストできますが、なぜ必要なのかわかりません。findClassメソッドの代理人loadClassDataメソッドがnullを返す場合(つまり、解読されたバイト配列でクラスを見つけることができない場合)、URLClassLoaderに渡します。 –

+0

興味深いことに、私はちょうどうまく働いてそれをキャストした。すべてが今、完璧に働いています。すべての助けをありがとう!とても有難い。 –

関連する問題