Po pierwsze widziałem Load Java-Byte-Code at Runtime i było to pomocne, jeśli chodzi o dotarcie do mnie w tym samym miejscu, w którym utknąłem.Jak załadować klasę z tablicy bajtów w systemie Android?
Próbuję załadować klasę z tablicy bajtów, aby uniknąć przechowywania pliku na dysku. Do celów testowania w tym przykładzie po prostu czytam w pliku .class do tablicy bajtowej, więc oczywiście plik jest nadal przechowywany na dysku, ale wystarczy sprawdzić, czy kod może działać.
Biorę tę tablicę bajtów, a następnie używam niestandardowej metody ClassLoader z metodą loadClass do ładowania klasy, ale to nie działa.
byte[] bytearray = null;
try{
RandomAccessFile f = new RandomAccessFile("/sdcard/ClassToGet.dex", "r");
bytearray = new byte[(int) f.length()];
f.read(bytearray);
MyClassLoader classloader = new MyClassLoader();
classloader.setBuffer(bytearray);
classloader.loadClass("com.pack.ClassIWant");
}
Oto realizacja ClassLoader:
public class MyClassLoader extends DexClassLoader {
private byte[] buffer;
@Override
public Class findClass(String className){
byte[] b = getBuffer();
return this.defineClass(className, b, 0, b.length);
}
public void setBuffer(byte[] b){
buffer = b;
}
public byte[] getBuffer(){
return buffer;
}
a błąd otrzymuję to:
java.lang.UnsupportedOperationException: nie można załadować tego typu klasy w pliku java.lang.VMClassLoader.defineClass (Metoda natywna)
Dostarczyłem go z plikami .class, plikami .dex, .apk, .jar, etc ... Nie mam pojęcia t "typ pliku klasowego", który chce ode mnie, a dokumentacja na nim jest nieistniejąca. Każda pomoc byłaby świetna Próbowałem dostać tę pracę przez cztery dni.
http://stackoverflow.com/a/3024261/61855 – theomega
ja wciąż otrzymuję ten sam komunikat o błędzie „UnsupportedOperationException”, nawet przy użyciu Dex plików/pliki jar. Co zrobiłeś ze swojego przykładu? – HumanCentipedeLinkedList
Do kogo napijesz się? Mnie? Jeśli odnosisz się do mojego pytania, które łączysz: nie korzystałem z Androida w tym projekcie, więc nie ma w nim żadnych problemów. – theomega