gpt4 book ai didi

android - DexClassLoader - 添加功能

转载 作者:搜寻专家 更新时间:2023-11-01 08:02:56 30 4
gpt4 key购买 nike

我正在使用 DexClassLoader 进行一些测试,看看是否可以使用新功能“更新”我的应用程序。目前我有这种测试方法,它与 testClass 一起使用并运行 test() 方法。我想知道的是,我如何“替换”或“更新”和已经存在的类..?欢迎任何想法或其他建议。

方法:

    public static void loadExtLib(String pathDexFile, Context ctx) {

String temp = ctx.getDir("temp", 0).toString();


DexClassLoader classLoader = new DexClassLoader(pathDexFile,
temp, null, ctx.getClass().getClassLoader());


String testClass = "com.mystudio.myapp.TestClass";
Class<?> libProviderClass = null;
try {
libProviderClass = classLoader.loadClass(testClass);
} catch (ClassNotFoundException e1) {

e1.printStackTrace();
}


try {
Method m = libProviderClass.getDeclaredMethod("test", null);
try {
m.invoke(libProviderClass, null);

} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
} catch (NoSuchMethodException e1) {
e1.printStackTrace();
}
Log.v("loadClass", "loaded: " + testClass);


}

最佳答案

一般情况下,您不能“替换”或“更新”类;只有 DexClassLoader 或其子加载器加载的类才能看到加载的类。例如,您不能将 java.lang.String 替换为执行恶意操作以规避类中的安全限制的版本。

这在一定程度上降低了加载多个具有相同名称的类的效用。另一方面,它确保类加载器 A 的操作独立于类加载器 B 的操作,只要一个不是另一个的父级。

使用运行时加载类的一种可能有用的方法是在基本加载器中定义一个接口(interface),该接口(interface)由类的“旧”和"new"版本实现。通过接口(interface)引用类的实例,您可以避免“旧”代码看不到"new"类定义的事实。

(思考这个问题的最好方法是在脑海中用它的类加载器标记每个类。那么很明显你不能将 String'new 传递给为 String 编写的函数'old,但如果它们都实现了 CharSequence'old,那么您始终可以通过它引用它们。)

Dalvik 测试中有一些代码执行运行时“替换”,通读可能会有用。查看068-classloader测试。 srcsrc-ex 的内容被构建到单独的 .jar 文件中;后者在运行时加载。

关于android - DexClassLoader - 添加功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18466996/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com