【发布时间】:2012-08-02 21:01:23
【问题描述】:
首先我看到了Load Java-Byte-Code at Runtime,它对我到达我目前遇到的同一个地方很有帮助。
我正在尝试从字节数组加载类以避免将文件存储在磁盘上。在本例中,出于测试目的,我只是将 .class 文件读入字节数组,因此显然该文件仍存储在磁盘上,但这只是为了查看代码是否可以工作。
我取这个字节数组,然后使用自定义的 ClassLoader 和 loadClass 方法来加载一个 Class,但它不起作用。
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");
}
这是 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;
}
我收到的错误是这样的:
java.lang.UnsupportedOperationException: 无法加载这种类型的类文件 在 java.lang.VMClassLoader.defineClass(Native Method)
我已经为它提供了 .class 文件、.dex 文件、.apk、.jar 等...我不知道它想要从我这里得到什么“类文件类型”,而且它的文档也不存在。任何帮助都会很棒我一直试图连续四天完成这项工作。
【问题讨论】:
-
即使使用 dex 文件/jar 文件,我仍然收到相同的“UnsupportedOperationException”错误消息。从你的例子中你最终做了什么?
-
你在找谁?我?如果您参考我链接的问题:我没有在这个项目中使用 Android,所以没有问题。
-
Android 26 有 InMemoryDexClassLoader developer.android.com/reference/dalvik/system/…
标签: java android dynamic classloader