Android 我使用了多个 ClassLoader/PathClassLoaders 吗?
Android Am I using multiple ClassLoader/PathClassLoaders?
我在 Android 中遇到类加载器问题。至少我认为它与类加载器有关。所以这就是问题所在...我有一个使用自定义小部件库的项目,我们称之为 CustomDialogView。它是 android 视图对象的子 class。我有一个我创建的扩展 CustomDialogView 的对话框...因此,重要的是要提及在此过程中如何创建和设置视图的结构(以及最终的 activity)。
我的项目是一个 Android 服务,它通过 ContentResolver 将视图注册到另一个进程。另一个进程然后提取此数据并将根据发送的 classes 创建视图。因此,视图最终在另一个过程中创建并膨胀(在 activity 中)。我知道,这很令人困惑,但这是我们的应用程序所使用的方法。因此,最终我可能需要在视图代码中显示一个对话框。他们给了我一个标准的对象,它使用反射来调用显示对话框方法。所以这是代码片段:
private static void showTheDialog(Object mainActivity, CustomDialogView view, boolean isModal) {
try {
mainActivity.getClass().getMethod("showDialog", View.class, Boolean.TYPE).invoke(mainActivity, view, isModal);
} catch (Exception var4) {
Log.w(TAG, var4.getClass().getName(), var4);
}
}
所以在他们的最后,他们在感兴趣的对象中有这个方法:
public void showDialog(View dialogView, boolean isModal)
所以问题就出在这里。在上面提到的方法(showDialog)中。他们尝试将 dialogView 转换为 CustomDialogView,因此:
CustomDialogView dialogContent = (CustomDialogView)dialogView;
结果我得到一个 ClassCastException。我确认我使用的是在两个项目之间实现 CustomDialogView 的相同版本的库。我在调用 showTheDialog 时打印 class 加载器,我得到:
dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.this.is.project.myproject-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.this.is.project.myproject-1, /vendor/lib, /system/lib]]]
我在 showDialog(在他们的项目中)中打印出 class 加载器,我得到:
dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.this.is.thier.project.thierproject-1.apk", zip file "/data/data/com.this.is.thier.project/code_cache/secondary-dexes/com.this.is.thier.project.thierproject-1.apk.classes2.zip", zip file "/data/data/com.this.is.thier.project/code_cache/secondary-dexes/com.this.is.thier.project.thierproject-1.apk.classes3.zip", zip file "/data/data/com.this.is.thier.project/code_cache/secondary-dexes/com.this.is.thier.project.thierproject-1.apk.classes4.zip", zip file "/data/data/com.this.is.thier.project/code_cache/secondary-dexes/com.this.is.thier.project.thierproject-1.apk.classes5.zip", zip file "/data/data/com.this.is.thier.project/code_cache/secondary-dexes/com.this.is.thier.project.thierproject-1.apk.classes6.zip"],nativeLibraryDirectories=[/data/app-lib/com.this.is.thier.project.thierproject-1, /vendor/lib, /system/lib]]]
所以,我们使用了两个不同的 class 加载器,对吗?我很难理解这个概念。如果您有任何其他问题,请告诉我。
所以,看来我正在使用多个 class 加载器。您可能知道,这会导致 class 转换异常发生。为了解决,我可以在传递的对象上使用反射。所以这是一个小片段:
obj.getClass().getMethod("getterMethod").invoke(obj);
上面的例子是把传入的对象(obj)传入,用反射得到它class然后调用我需要的方法。我希望这对其他人有帮助。现在没有 class 加载器问题。谢谢
我在 Android 中遇到类加载器问题。至少我认为它与类加载器有关。所以这就是问题所在...我有一个使用自定义小部件库的项目,我们称之为 CustomDialogView。它是 android 视图对象的子 class。我有一个我创建的扩展 CustomDialogView 的对话框...因此,重要的是要提及在此过程中如何创建和设置视图的结构(以及最终的 activity)。
我的项目是一个 Android 服务,它通过 ContentResolver 将视图注册到另一个进程。另一个进程然后提取此数据并将根据发送的 classes 创建视图。因此,视图最终在另一个过程中创建并膨胀(在 activity 中)。我知道,这很令人困惑,但这是我们的应用程序所使用的方法。因此,最终我可能需要在视图代码中显示一个对话框。他们给了我一个标准的对象,它使用反射来调用显示对话框方法。所以这是代码片段:
private static void showTheDialog(Object mainActivity, CustomDialogView view, boolean isModal) {
try {
mainActivity.getClass().getMethod("showDialog", View.class, Boolean.TYPE).invoke(mainActivity, view, isModal);
} catch (Exception var4) {
Log.w(TAG, var4.getClass().getName(), var4);
}
}
所以在他们的最后,他们在感兴趣的对象中有这个方法:
public void showDialog(View dialogView, boolean isModal)
所以问题就出在这里。在上面提到的方法(showDialog)中。他们尝试将 dialogView 转换为 CustomDialogView,因此:
CustomDialogView dialogContent = (CustomDialogView)dialogView;
结果我得到一个 ClassCastException。我确认我使用的是在两个项目之间实现 CustomDialogView 的相同版本的库。我在调用 showTheDialog 时打印 class 加载器,我得到:
dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.this.is.project.myproject-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.this.is.project.myproject-1, /vendor/lib, /system/lib]]]
我在 showDialog(在他们的项目中)中打印出 class 加载器,我得到:
dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.this.is.thier.project.thierproject-1.apk", zip file "/data/data/com.this.is.thier.project/code_cache/secondary-dexes/com.this.is.thier.project.thierproject-1.apk.classes2.zip", zip file "/data/data/com.this.is.thier.project/code_cache/secondary-dexes/com.this.is.thier.project.thierproject-1.apk.classes3.zip", zip file "/data/data/com.this.is.thier.project/code_cache/secondary-dexes/com.this.is.thier.project.thierproject-1.apk.classes4.zip", zip file "/data/data/com.this.is.thier.project/code_cache/secondary-dexes/com.this.is.thier.project.thierproject-1.apk.classes5.zip", zip file "/data/data/com.this.is.thier.project/code_cache/secondary-dexes/com.this.is.thier.project.thierproject-1.apk.classes6.zip"],nativeLibraryDirectories=[/data/app-lib/com.this.is.thier.project.thierproject-1, /vendor/lib, /system/lib]]]
所以,我们使用了两个不同的 class 加载器,对吗?我很难理解这个概念。如果您有任何其他问题,请告诉我。
所以,看来我正在使用多个 class 加载器。您可能知道,这会导致 class 转换异常发生。为了解决,我可以在传递的对象上使用反射。所以这是一个小片段:
obj.getClass().getMethod("getterMethod").invoke(obj);
上面的例子是把传入的对象(obj)传入,用反射得到它class然后调用我需要的方法。我希望这对其他人有帮助。现在没有 class 加载器问题。谢谢