java - 将 Class.forName 对象转换为该对象实现的接口(interface)时出现 ClassCastException

标签 java android classcastexception

我想为 android 创建一些插件示例,所以我有 3 个项目:

ExternalLibInterface - 包含 IExternalLib,并构建为 externallibinterface.jar 文件

  package com.example.externallibinterface;    
  public interface IExternalLib {
    public String someMethod( String param );
  }

ExternalLib - 包含 externallibinterface.jarSomeClass 实现 IExternalLib,构建为 externallib.apk

   package com.example.externallib;
   import com.example.externallibinterface.IExternalLib;
   public class SomeClass implements IExternalLib {
       public String someMethod(String arg0) {
           return arg0;
       }
   }

SomeApp - 包含 externallibinterface.jar 和 Activity 类 - 我从中加载外部 apk 和类的应用程序。

   import com.example.externallibinterface.IExternalLib;    
   import dalvik.system.PathClassLoader;

   public class MainActivity extends Activity {

       @Override
       public void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);

           String apkToLoad = null;

           String externalPackagePath = "com.example.externallib";
           String externalClassPath = "com.example.externallib.SomeClass";

           try {
               apkToLoad = getPackageManager()
                    .getApplicationInfo( externalPackagePath, MODE_PRIVATE ).sourceDir;
           } catch ( PackageManager.NameNotFoundException e ) {
               e.printStackTrace();
           }

           PathClassLoader pathClassLoader = 
                   new PathClassLoader( apkToLoad, 
                ClassLoader.getSystemClassLoader() );

           try {
               Class<?> c = Class.forName( externalClassPath, true, pathClassLoader );

               Object someClassInstance = c.newInstance();
                       //exception ClassCastException here
               IExternalLib i = (IExternalLib) someClassInstance;
               i.someMethod( "some string" );               
           } catch (ClassNotFoundException e1) {            
            e1.printStackTrace();
           } catch (InstantiationException e) {
            e.printStackTrace();
           } catch (IllegalAccessException e) {         
            e.printStackTrace();
           } catch ( ClassCastException e ) {
            e.printStackTrace();
           }
       }
   }

但是当我将 Object someClassInstance 转换为 IExternalLib 时,我得到了 ClassCastException。 为什么? IExternalLib 定义在第三位(在 externallibinterface.jar 中)。

最佳答案

尝试以下操作:

Class<? extends IExternalLib> l_clazz; // our expected class
Class<?> clazz = Class.forName("com.example.externallib.SomeClass"); // our unknown class

// check if our unknown class can be cast to our expected class
if ((l_clazz = clazz.asSubclass(IExternalLib.class)) != null) {
    IExternalLib i = l_clazz.newInstance();
    i.someMethod( "some string" );
}

关于java - 将 Class.forName 对象转换为该对象实现的接口(interface)时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12383376/

相关文章:

android - 如何合并图像并相互叠加

java - 如何转换相同加载不同类加载器的两个实例?

JavaFX ChangeListener 并不总是有效

java - 我如何安排gui和gui组件状态读取的线程同步?

Java在线程完成之前执行下一个任务

java - 如果数据已更改,则不要更新 ResultSet 中的行

android - 使用按钮添加动态小部件

java - 我的 Android 包名称应该是什么?

java - org.apache.tomcat.dbcp.dbcp2.PoolingDataSource$PoolGuardConnectionWrapper 无法转换为 oracle.jdbc.OracleConnection

java - 在 android studio 上创建新项目时出现 "Could not create an instance of Tooling API implementation using the specified Gradle distribution"错误