Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.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 如何通过方法调用从对象强制转换类(ClassCastException)_Java_Android - Fatal编程技术网

Java 如何通过方法调用从对象强制转换类(ClassCastException)

Java 如何通过方法调用从对象强制转换类(ClassCastException),java,android,Java,Android,我有主apk和子apk(实际上子apk是一种库) 两个库都有相同的arr文件 主应用程序通过dexclassloader从子应用程序加载“MyClassInterface”类 因为主应用程序在资产文件夹中有子apk文件 “MyClassInterface”类的“getMyClassInstance”方法通过方法调用返回MyClass实例 所以,我想要的是 MyClass myClass = (MyClass) methodGetMyClass.invoke(object); myClass.ge

我有主apk和子apk(实际上子apk是一种库)
两个库都有相同的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”)谢谢,已更改!这有必要吗?如果是,则应将其添加到以下答案中