URLClassLoader - Использование зашифрованного Jar - PullRequest
1 голос
/ 24 марта 2012

Я видел много зашифрованных загрузчиков классов.Например:

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

Это именно тот, который я пытаюсь адаптировать к своим потребностям.

У меня в основном есть зашифрованный JAR, который я расшифровалв байтовый массив ("byte [] decrypt;").Теперь я хочу использовать этот байтовый массив для загрузки классов, поэтому мне не нужно создавать на жестком диске файл, содержащий расшифрованный файл.

Мне нужно использовать URLClassLoader и NOT ClassLoader, поскольку у меня есть другоймассив ("URL [] urls"), из которого ClassLoader должен получить.(Если вы не можете сделать это с помощью обычного загрузчика классов?)

Есть идеи?

1 Ответ

1 голос
/ 24 марта 2012

Это выглядит очень похоже на этот пост:

Загрузка байтового массива в загрузчик классов памяти

Я думаю, что единственной модификацией здесь является использование родительского загрузчика классов, поэтому при создании экземпляра пользовательского загрузчика классов передайте 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 ...
    . . .
  }
}
...