我有一个带有单一方法的Java接口的Android应用程序,说void doStuff(String className)
。其他人会为我提供.jar文件,每个文件都包含一个实现此界面的类,以包含在我的APK中。当调用doStuff()
时,我将接收实现接口的类的名称作为参数。我希望能够获得该类的实例并在运行时调用doStuff()
,而不需要在我自己的代码中定义任何特定的实现类类型。什么是完成这个最好的方法?Android - 在编译时使用未知实现的Java接口
1
A
回答
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());
相关问题
- 1. 使用Ninject将接口绑定到编译时未知的多个实现
- 2. 创建(=编译)在运行时类,它实现已知接口
- 3. C++编译时接口实现检查
- 4. Java RMI的教程编译时错误 - 接口未发现
- 5. 如何实现在编译时不可用的接口
- 6. 使用编译时方面来实现抽象接口
- 7. 没有编译错误的一个未实现的接口
- 8. F#编译错误实现C#接口
- 9. 确保类型在编译时在Go中实现接口
- 10. 无法编译实现了接口类的java类
- 11. 如何确保字段在编译时实现接口
- 12. 的Java编译接口
- 13. Java中的编译接口
- 14. 使用g ++编译OpenMP时的未知编译码
- 15. 如何在Java 8编译时确保方法签名“实现”功能接口
- 16. Java实现接口
- 17. Java接口实现
- 18. 无法编译Java代码来实现“接口”
- 19. 在java中实现接口
- 20. 实现接口在Java中
- 21. 使用子类替换未实现接口的Java类
- 22. 使用arm-linux-gcc编译STLPort时出现未知错误
- 23. 使用r.js编译时出现“ReferenceError:窗口未定义”
- 24. Java - 使用Object参数实现接口
- 25. IncompatibleClassChangeError:接口未实现
- 26. 具有未知通用类型接口的Java通用编程
- 27. 在运行时实现接口:未实现get_Value方法
- 28. 实现从接口的Java
- 29. 实现接口的Java
- 30. Java中接口的实现
你为什么要传递类名而不是对象本身? – Eric
对不起,我应该指定doStuff()的调用通过一个单独的应用程序来到我的代码中,所以没有任何对象可以传入。我需要在接收到正确的类时没有实例化对象电话。 –
然后,您可能正在寻找:[使用类名称和调用构造函数创建实例](http://stackoverflow.com/questions/6094575/creating-an-instance-using-the-class-name-and -calling-constructor) – Eric