我有一个带有Java接口的Android应用程序,它有一个方法,比如void doStuff(String className)
。其他人将为我提供.jar文件,每个文件包含一个实现此接口的类,以包含在我的APK中。调用doStuff()
时,我将接收实现该接口的类的名称作为参数。我希望能够获得该类的实例并在运行时调用doStuff()
,而不需要在我自己的代码中定义任何特定的实现类类型。实现这一目标的最佳方法是什么?
答案 0 :(得分:2)
你可以用温和的反射来做到这一点:
Class<? Extends MyInterface> myClass = (Class<? Extends MyInterface>)Class.forName(className);
MyInterface myObject = myClass.newInstance();
myObject.doStuff();
这要求实现类具有可访问的no-args构造函数。
答案 1 :(得分:1)
您可以通过反射实现此目的,这是一个可以根据需要进行更改的说明性示例。
此代码假设doStuff不接受任何参数,并且该类具有定义的默认构造函数。
Class<?> myClass = Class.forName(className);
Method doStuffMethod = myClass.getMethod("doStuff");
doStuffMethod.invoke(myClass.newInstance());