Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android-将类动态加载到内存中_Java_Android_Reflection_Dexclassloader - Fatal编程技术网

Java Android-将类动态加载到内存中

Java Android-将类动态加载到内存中,java,android,reflection,dexclassloader,Java,Android,Reflection,Dexclassloader,这很好,但只能通过从内部/外部存储器将编译后的类作为dex/jar文件加载来工作 如何将类直接加载到内存中,而不首先向卡中写入任何内容 我知道Peter Lawrey的(动态将字符串编译为类)很完美,但它在android中不起作用。编写Java类加载器的一般原则也适用于此,所以基本上你需要做的是编写一个类加载器,它可以生成一个类实例,例如,通过调用defineClass()。当然,这涉及到创建一个有效的dex字节码数组。我还没有这样做,除了非常特殊的场合之外,无论如何我都不会尝试这样做。如果您沿

这很好,但只能通过从内部/外部存储器将编译后的类作为dex/jar文件加载来工作

如何将类直接加载到内存中,而不首先向卡中写入任何内容


我知道Peter Lawrey的(动态将字符串编译为类)很完美,但它在android中不起作用。

编写Java类加载器的一般原则也适用于此,所以基本上你需要做的是编写一个类加载器,它可以生成一个
实例,例如,通过调用
defineClass()
。当然,这涉及到创建一个有效的dex字节码数组。我还没有这样做,除了非常特殊的场合之外,无论如何我都不会尝试这样做。如果您沿着这条路走,请记住只使用Java 5和6中已有的类加载器功能。

编写Java类加载器的一般原则也适用于这里,因此基本上您需要编写一个类加载器,它可以生成一个
实例,例如通过调用
defineClass()
。当然,这涉及到创建一个有效的dex字节码数组。我还没有这样做,除了非常特殊的场合之外,无论如何我都不会尝试这样做。如果您沿着这条路走,请记住只使用Java 5和6中已有的类加载器特性。

正如Thomas所说,您可以反射地调用要加载类的类加载器的受保护的
defineClass()
方法

以下是如何实现这一目标的示例:

public static Class<?> loadClass(byte[] code, ClassLoader loadInto) throws InvocationTargetException
{
    try {
        Method m = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class);
        m.setAccessible(true); // Make sure we can invoke the method
        return (Class<?>) m.invoke(loadInto, code, 0, code.length);
    }
    // An exception should only be thrown if the bytecode is invalid
    // or a class with the same name is already loaded
    catch (NoSuchMethodException e) { throw new RuntimeException(e); }
    catch (IllegalAccessException e){ throw new RuntimeException(e); }
}
公共静态类loadClass(字节[]代码,类装入器loadInto)抛出InvocationTargetException
{
试一试{
方法m=ClassLoader.class.getDeclaredMethod(“defineClass”,字节[].class,int.class,int.class);
m、 setAccessible(true);//确保我们可以调用该方法
return(Class)m.invoke(loadInto,code,0,code.length);
}
//只有在字节码无效时才应引发异常
//或者已加载具有相同名称的类
catch(NoSuchMethodException e){抛出新的RuntimeException(e);}
catch(IllegalAccessException e){throw new RuntimeException(e);}
}

尽管如此,我感觉您所指的是运行时将包含有效Java的字符串编译成字节码,基于您包含的链接。虽然我不知道有什么方法可以做到这一点,但我建议您看看这个:

正如Thomas所说,您可以反射性地调用要加载类的类加载器的受保护的
defineClass()
方法

以下是如何实现这一目标的示例:

public static Class<?> loadClass(byte[] code, ClassLoader loadInto) throws InvocationTargetException
{
    try {
        Method m = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class);
        m.setAccessible(true); // Make sure we can invoke the method
        return (Class<?>) m.invoke(loadInto, code, 0, code.length);
    }
    // An exception should only be thrown if the bytecode is invalid
    // or a class with the same name is already loaded
    catch (NoSuchMethodException e) { throw new RuntimeException(e); }
    catch (IllegalAccessException e){ throw new RuntimeException(e); }
}
公共静态类loadClass(字节[]代码,类装入器loadInto)抛出InvocationTargetException
{
试一试{
方法m=ClassLoader.class.getDeclaredMethod(“defineClass”,字节[].class,int.class,int.class);
m、 setAccessible(true);//确保我们可以调用该方法
return(Class)m.invoke(loadInto,code,0,code.length);
}
//只有在字节码无效时才应引发异常
//或者已加载具有相同名称的类
catch(NoSuchMethodException e){抛出新的RuntimeException(e);}
catch(IllegalAccessException e){throw new RuntimeException(e);}
}
尽管如此,我感觉您所指的是运行时将包含有效Java的字符串编译成字节码,基于您包含的链接。虽然我不知道有什么方法可以做到这一点,但我建议您看看: