2013-02-05 28 views
1

我有一个带有单一方法的Java接口的Android应用程序,说void doStuff(String className)。其他人会为我提供.jar文件,每个文件都包含一个实现此界面的类,以包含在我的APK中。当调用doStuff()时,我将接收实现接口的类的名称作为参数。我希望能够获得该类的实例并在运行时调用doStuff(),而不需要在我自己的代码中定义任何特定的实现类类型。什么是完成这个最好的方法?Android - 在编译时使用未知实现的Java接口

+2

你为什么要传递类名而不是对象本身? – Eric

+0

对不起,我应该指定doStuff()的调用通过一个单独的应用程序来到我的代码中,所以没有任何对象可以传入。我需要在接收到正确的类时没有实例化对象电话。 –

+1

然后,您可能正在寻找:[使用类名称和调用构造函数创建实例](http://stackoverflow.com/questions/6094575/creating-an-instance-using-the-class-name-and -calling-constructor) – Eric

回答

2

您可以反射温和的量做到这一点:

Class<? Extends MyInterface> myClass = (Class<? Extends MyInterface>)Class.forName(className); 
MyInterface myObject = myClass.newInstance(); 
myObject.doStuff(); 

这就要求实现类具有访问无参数的构造函数。

+0

这是否适用于所有版本的Android? –

+0

如果没有,那么Android会出现如此严重的问题,实际上根本没有任何工作。 – EJP

1

您可以通过反射来实现这一点,下面是一个说明性示例,您可以根据需要进行更改。

此代码假设doStuff不接受任何参数,并且该类具有定义的默认构造函数。

Class<?> myClass = Class.forName(className); 

Method doStuffMethod = myClass.getMethod("doStuff"); 

doStuffMethod.invoke(myClass.newInstance());