Динамически загружать класс в виде байтового массива с помощью ClassLoader в Android
Я пытаюсь загрузить класс в виде байтового массива, чтобы я мог отправить его по сети и выполнить его удаленно через Reflection. Этот класс (в данном случае Bubble) находится в том же пакете. Дело в том, что я не могу получить ресурс, используя метод getResourceAsStream (classpath)..GetResourceAsStream (classpath) всегда возвращает ноль. Я протестировал этот код в проекте 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;
}
1 ответ
Android использует формат файлов dex для классов, и лучшим способом было бы не отправлять zip (jarred) classes.dex, который содержит все нужные вам классы.