java - 如何从android中的字节数组加载类?

标签 java android dynamic classloader

首先我看到了Load Java-Byte-Code at Runtime就让我到达我目前所处的同一地点而言,这很有帮助。

我正在尝试从字节数组加载类以避免将文件存储在磁盘上。出于测试目的,在此示例中,我只是将 .class 文件读入字节数组,因此显然该文件仍存储在磁盘上,但这只是为了查看代码是否可以工作。

我采用这个字节数组,然后使用带有方法 loadClass 的自定义 ClassLoader 来加载类,但它不起作用。

    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");
    } 

这是类加载器的实现:

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(本地方法)

我已经为它提供了 .class 文件、.dex 文件、.apk、.jar 等...我不知道它要从我这里得到什么“类文件类型”,而且关于它的文档也不存在。任何帮助都会很棒我一直试图连续四天完成这项工作。

最佳答案

我和你有同样的问题。

我收到“无法加载此类文件”错误的原因很简单。

在平台源代码中,与方法“defineClass”相关的“/dalvik/vm/native/java_lang_VMClassLoader.cpp”总是返回如下异常。 (版本:ICS)

最后得出的结论是无法加载字节数组格式的.dex。

有没有人可以使用字节数组加载.dex? (不使用文件)

/*
 * static Class defineClass(ClassLoader cl, String name,
 *     byte[] data, int offset, int len)
 *     throws ClassFormatError
 *
 * Convert an array of bytes to a Class object.
 */
static void Dalvik_java_lang_VMClassLoader_defineClass(const u4* args, JValue* pResult)
{
    Object* loader = (Object*) args[0];
    StringObject* nameObj = (StringObject*) args[1];
    const u1* data = (const u1*) args[2];
    int offset = args[3];
    int len = args[4];
    char* name = NULL;

    name = dvmCreateCstrFromString(nameObj);
    ALOGE("ERROR: defineClass(%p, %s, %p, %d, %d)",
        loader, name, data, offset, len);
    dvmThrowUnsupportedOperationException(
        "can't load this type of class file");

    free(name);
    RETURN_VOID();
}

/*
 * static Class defineClass(ClassLoader cl, byte[] data, int offset,
 *     int len)
 *     throws ClassFormatError
 *
 * Convert an array of bytes to a Class object. Deprecated version of
 * previous method, lacks name parameter.
 */
static void Dalvik_java_lang_VMClassLoader_defineClass2(const u4* args, JValue* pResult)
{
    Object* loader = (Object*) args[0];
    const u1* data = (const u1*) args[1];
    int offset = args[2];
    int len = args[3];

    ALOGE("ERROR: defineClass(%p, %p, %d, %d)",
        loader, data, offset, len);
    dvmThrowUnsupportedOperationException(
        "can't load this type of class file");

    RETURN_VOID();
}

关于java - 如何从android中的字节数组加载类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11785713/

相关文章:

android - Android 中的 PJSip

php - Perl 中的动态下拉列表

java - 如何使用 Visual Studio Code 调试 java dropwizard 应用程序

java - 单元测试在构建服务中失败但在本地失败

java - JAX-WS - 添加 SOAP header

android - 将数据从一个 View 模型传递到另一个 android MVVM

android - Gradle + AndroidAnnotations 生成重复的类错误 - 需要在每次构建之前清理项目

c++ - 为什么动态内存允许在运行时操作数组?

html - 使用 MVC 的布局页面中的动态 Logo 图像

java - 为什么输入错误值后输出是三行消息而不是一行?