Java 如何通过方法调用从对象强制转换类(ClassCastException)
我有主apk和子apk(实际上子apk是一种库)Java 如何通过方法调用从对象强制转换类(ClassCastException),java,android,Java,Android,我有主apk和子apk(实际上子apk是一种库) 两个库都有相同的arr文件 主应用程序通过dexclassloader从子应用程序加载“MyClassInterface”类 因为主应用程序在资产文件夹中有子apk文件 “MyClassInterface”类的“getMyClassInstance”方法通过方法调用返回MyClass实例 所以,我想要的是 MyClass myClass = (MyClass) methodGetMyClass.invoke(object); myClass.ge
两个库都有相同的arr文件 主应用程序通过dexclassloader从子应用程序加载“MyClassInterface”类
因为主应用程序在资产文件夹中有子apk文件 “MyClassInterface”类的“getMyClassInstance”方法通过方法调用返回MyClass实例
所以,我想要的是
MyClass myClass = (MyClass) methodGetMyClass.invoke(object);
myClass.getName();
但是这里的ClassCastExetion类似于下面的日志不可能吗?或者如果不是,我该如何投球
System.err java.lang.ClassCastException:com.example.library.MyClass cannot be cast to com.example.libary.MyClass
System.err at com.example.woosuk.mainapplication.MainActivity.onCreate(MainActivity.java:34)
System.err at android.app.Activity.performCreate(Activity.java:7174)
System.err at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
System.err at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2908)
System.err at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3030)
System.err at android.app.ActivityThread.-wrap11(Unknown Source:0)
System.err at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
System.err at android.os.Handler.dispatchMessage(Handler.java:105)
System.err at android.os.Looper.loop(Looper.java:164)
System.err at android.app.ActivityThread.main(ActivityThread.java:6938)
System.err at java.lang.reflect.Method.invoke(Native Method)
System.err at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
System.err at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
--------------------主应用程序-----------------------------
DexClassLoader dexClassLoader = new DexClassLoader("data/data/com.example.woosuk.mainapplication/sub.apk", "", null, ClassLoader.getSystemClassLoader());
try {
Class<?> _class = dexClassLoader.loadClass("com.example.woosuk.subapplication.MyClassInterface");
Object object = _class.newInstance();
Method methodGetIntValue = _class.getMethod("getIntValue");
Log.e("TEST", "getIntValue return " + methodGetIntValue.invoke(object));//working fine
Method methodGetMyClass = _class.getMethod("getMyClassInstance");
MyClass myClass = (MyClass) methodMyClass.invoke(object);//ClassCastException!!!!!
} catch (Exception e) {
e.printStackTrace();
}
public class MyClassInterface {
public MyClass getMyClassInstance() {
return new MyClass(99, "test");
}
public int getIntValue() {
return 99;
}
}
---------------------我在图书馆上课--------------
DexClassLoader dexClassLoader = new DexClassLoader("data/data/com.example.woosuk.mainapplication/sub.apk", "", null, ClassLoader.getSystemClassLoader());
try {
Class<?> _class = dexClassLoader.loadClass("com.example.woosuk.subapplication.MyClassInterface");
Object object = _class.newInstance();
Method methodGetIntValue = _class.getMethod("getIntValue");
Log.e("TEST", "getIntValue return " + methodGetIntValue.invoke(object));//working fine
Method methodGetMyClass = _class.getMethod("getMyClassInstance");
MyClass myClass = (MyClass) methodMyClass.invoke(object);//ClassCastException!!!!!
} catch (Exception e) {
e.printStackTrace();
}
public class MyClassInterface {
public MyClass getMyClassInstance() {
return new MyClass(99, "test");
}
public int getIntValue() {
return 99;
}
}
Github:
图书馆:
子页:
主应用程序:
与相同的问题,因为您没有使用相同的类加载器来加载这两个类
请尝试使用
MyClass.class.getClassLoader()
而不是ClassLoader.getSystemClassLoader()
更改\u class.getMethod(“getMyClass”)代码>到\u class.getMethod(“getMyClassInstance”)代码>谢谢,已更改!这有必要吗?如果是,则应将其添加到以下答案中