Динамически загружать класс в виде массива байтов с помощью ClassLoader в Android

Я пытаюсь загрузить класс в виде массива байтов, чтобы я мог отправить его по сети и выполнить его удаленно через Reflection. Этот класс (в данном случае Bubble) находится в том же пакете. Дело в том, что я не могу получить ресурс с помощью метода getResourceAsStream(classpath). .getResourceAsStream(classpath) всегда возвращает значение null. Я протестировал этот код в проекте Java и работал правильно. Я думаю, проблема в пути к ресурсу, загружает ли Android файл .class?

private void doSomething() {

    Bubble b = new Bubble();

    try {
        //Try to retrieve the class byte array
        byte[] classBytes = getBytes(b.getClass());         
    } catch (IOException e) {
        e.printStackTrace(System.err);
    }
    ... 
}

private byte[] getBytes(Class c) throws IOException{

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    byte b[] = new byte[1024];
    String classpath = c.getCanonicalName().replace('.', File.pathSeparatorChar) + ".class";
    //classpath is now, for example, com:myproject:Bubble.class
    InputStream in = c.getClassLoader().getResourceAsStream(classpath);
    int load;
    while((load=in.read(b))>0){
        out.write(b,0,load);
    }
    byte[] _r = out.toByteArray();
    out.close();
    in.close();
    return _r;
}

person user3749052    schedule 17.06.2014    source источник


Ответы (1)


Android использует формат файла dex для классов, и лучше всего не отправлять заархивированный (jarred) файл class.dex, который содержит все необходимые вам классы.

person Tapemaster    schedule 04.06.2015