- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 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测试。 src
和 src-ex
的内容被构建到单独的 .jar 文件中;后者在运行时加载。
关于android - DexClassLoader - 添加功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18466996/
我在网上看到一些教程,它们调用简单的方法,我只需要调用接受 Context 作为参数的方法“startDownload”。我现在称它为: Class loaded = cl.loadClass("co
我在我的 android 应用程序中使用来自 Assets 或 sdcard 的外部 jar。为此,我使用 DexClassLoader。 DexClassLoader cl = new DexCla
我正在使用 DexClassLoader 进行一些测试,看看是否可以使用新功能“更新”我的应用程序。目前我有这种测试方法,它与 testClass 一起使用并运行 test() 方法。我想知道的是,我
我在运行时使用 DexClassLoader 类从 SD 卡加载一个 jar 文件 final String libPath = Environment.getExternalStorageDir
对于一个长期的学生项目,我正在尝试开发一个带有插件的模块化应用程序。具体来说,我们会: 一个主应用程序,我们可以在其中搜索、更新、删除和运行插件。这个主应用程序还会存储一些来自插件的数据。 从带有代码
我的要求是启动一个 Activity,该 Activity 存在于 Assets 文件夹内的 aar 文件中或可能位于 SDCard 中。但我遇到了以下异常: 01-05 21:06:18.717 3
我有一个图书馆,我计划以 dex 形式使用。我想直接针对这个库进行编译,但不导出它。相反,我想将它放在我的资源中并使用类加载器实际实例化它。 这是我的图书馆: public class Foo {
所以我正在尝试加载我从我的应用程序编写的类,但我收到 ClassNotFound 异常。 类(class): public class myclass{ public String doSom
我想在我的案例 JadeAndroid.jar 中加载使用外部库编译的 Android 类(使用 dexClassLoader)。此类 (dex) 在 jar 中导出(我正在使用 ant 脚本),其中
我正在做一个试图通过加载外部库的项目Dex类加载器。这在 2.3 中运行良好: public class FormularDisplayLoader { public final static
我将一个包含 .dex 文件的 .jar 文件放入目录“/sdcard”,然后尝试分别使用 DexClassLoader 和 PathClassLoader 加载 .jar 文件中的类。他们都可以成功
我正在尝试构建一个插件系统,其中 DexClassLoader 从其他已安装的包含 fragment (我的插件)的 apk 中获取代码,并在我的主机中显示它们。这工作得很好。 我也喜欢让插件热插拔,
我正在尝试为 Android 应用程序构建一个插件架构。我有一个主机应用程序,它将检查 apk“插件”文件的目录,将它们加载到 DexClassLoader 中,并调用一个方法来获取 DerivedL
我已成功通过以下方式从 dex 文件中动态加载类 enter code here File file = getDir("dex", 0); DexClassLoader dexClassLoader
我有点碰壁了。任何帮助,将不胜感激。我有一个应用程序,我想使用 DexClassLoader 加载另一个 apk 文件。 这是我的代码: DexClassLoader dLoader = new De
对于方法: Ldalvik/system/DexClassLoader;->findClass(Ljava/lang/String;)Ljava/lang/Class; 那DexClassLoader
我正在尝试制作一个简单的 android 应用程序,它可以在运行时从 SD 卡加载 DEX 文件。 该应用程序有两个 Activity 。第一个 Activity 是一个带有按钮的简单屏幕。按下按钮时
我是一名优秀的程序员,十分优秀!