java-通过反射创建对象时将对象强制转换为接口

java-通过反射创建对象时将对象强制转换为接口,第1张

概述我正在尝试在Android中进行一些 *** 作,并且在尝试将另一个.apk中的类强制转换到我的界面时遇到了困扰.我在实现该接口的其他.apks中具有接口和各种类.我使用PackageManager的查询方法查找其他类,并使用Application#createPackageContext()获取该上下文的类加载器.然后,我加载该类,创建一个新实例,然后尝试将其强制

我正在尝试在Android中进行一些 *** 作,并且在尝试将另一个.apk中的类强制转换到我的界面时遇到了困扰.我在实现该接口的其他.apks中具有接口和各种类.我使用PackageManager的查询方法查找其他类,并使用Application#createPackageContext()获取该上下文的类加载器.然后,我加载该类,创建一个新实例,然后尝试将其强制转换为我确实可以实现的接口.

当我尝试强制转换时,它将引发类强制转换异常.我尝试了各种方法,例如先加载接口,使用Class#asSubclass等,但这些方法均无效. Class#getInterfaces()显示接口已实现.我的代码如下:

PackageManager pm = getPackageManager();List<ResolveInfo> lr = pm.queryIntentServices(new Intent("com.example.some.action"),0);ArrayList<MyInterface> List = new ArrayList<MyInterface>();for (ResolveInfo r : lr) {    try {        Context c = getApplication().createPackageContext(r.serviceInfo.packagename,Context.CONTEXT_IGnorE_Security | Context.CONTEXT_INCLUDE_CODE);        ClassLoader cl = c.getClassLoader();        String classname = r.serviceInfo.name;        if (classname != null) {            try {                Class<?> cls = cl.loadClass(classname);                Object o = cls.newInstance();                if (o instanceof MyInterface) { //fails                    List.add((MyInterface) o);                }            } catch (ClassNotFoundException e) {                // Todo auto-generated catch block                e.printstacktrace();            } // some exceptions removed for readability        }    } catch (nameNotFoundException e1) {        e1.printstacktrace();    }}
最佳答案我尚未进行任何AndroID开发,因此我不确定其类加载器的细微差别,但是在一般的Java编程中,由不同类加载器加载的两个类并不相同……即使它们是从同一个类加载的“文件”.

因此,如果将接口X加载到“您的”类加载器中,然后从“外国”类加载器中获得一个似乎实现类X的对象,则对“您的” X的转换将失败.

为了使其工作,X必须从作为其他两个加载程序的公共父级的类加载程序中加载.

总结

以上是内存溢出为你收集整理的java-通过反射创建对象时将对象强制转换为接口 全部内容,希望文章能够帮你解决java-通过反射创建对象时将对象强制转换为接口 所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1145200.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存