Загрузите байтовый массив в загрузчик классов памяти - PullRequest
0 голосов
/ 23 марта 2012

Мне интересно, как я могу загрузить байтовый массив в память URLClassLoader? Массив байтов - это расшифрованные байты файла JAR (как показано ниже)!

Большинство загрузчиков классов памяти используют ClassLoader, а не URLClassLoader! Мне нужно, чтобы он использовал URLClassLoader.

    byte[] fileB = Util.crypt.getFileBytes(inputFile);
    byte[] dec;
    dec = Util.crypt.decrypt(fileB, "16LENGTHLONGKEYX".getBytes());
    //Load bytes into memory and load a class here?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

Вы смотрели на пример NetworkClassLoader в javadocs ClassLoader:

http://docs.oracle.com/javase/6/docs/api/index.html?java/lang/ClassLoader.html

Используя это в качестве основы, вам просто нужно реализовать метод loadClassData, который будет тянуть желаемыйресурс из расшифрованных байтов банок.Вы можете обернуть расшифрованные байты JarInputStream(new ByteArrayInputStream(dec)), затем перебирать записи jar, пока не найдете интересующий вас ресурс / класс, а затем вернуть байтовый массив записи jar

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

Я опубликую здесь реализацию, которую я делал в прошлом:

// main
String className = "tests.compiler.DynamicCompilationHelloWorldEtc";
//...
ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
File classesDir = new File(tempDir);
CustomClassLoader ccl = new CustomClassLoader(classLoader, classesDir);         
if (ccl != null) {
    Class clazz = ccl.loadClass(className);
///...
}

Мой пользовательский загрузчик классов:

package tests.classloader;

import java.io.File;
import java.io.FileInputStream;
import java.nio.ByteBuffer;

public class CustomClassLoader extends ClassLoader {

    private File classesDir;

    public CustomClassLoader(ClassLoader parent, File classesDir) {
       super(parent);      

       this.classesDir = classesDir;
    }

    public Class findClass(String name) {
       byte[] data = loadDataFromAny(name);
       return defineClass(name, data, 0, data.length);
    }

    private byte[] loadDataFromAny(String name) {

        name = name.replace('.', '/');
        name = name + ".class";

        byte[] ret = null;

        try {
            File f = new File(classesDir.getAbsolutePath(), name);
            FileInputStream fis = new FileInputStream(f);

            ByteBuffer bb = ByteBuffer.allocate(4*1024); 
            byte[] buf = new byte[1024];
            int readedBytes = -1; 

            while ((readedBytes = fis.read(buf)) != -1) {
                bb.put(buf, 0, readedBytes);
            }

            ret = bb.array();           
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        return ret;
    }
}
...