因此问题194698显示了如何在运行时加载jar文件,您可以加载单个命名类并获取Class对象。现在我的问题是我希望能够将这些类转换为它们真正的类型,但我不能,因为我不能使用导入,因为整点是在运行时加载它而不是编译时。
似乎要走的路是使用反射来发现函数和字段名称,但这似乎很脆弱,因为jar文件中的API可能会发生变化,代码在运行之前不会中断。
有更好的方法吗?
答案 0 :(得分:3)
通常的方法是通过定义良好的界面使用动态加载的类(如您所链接的问题的接受答案所示,Runnable
)。这样,只要实现接口,它们的实现细节就可以自由改变。所以你将加载类的实例强制转换为try块中的那个接口,如果类没有实现接口,则捕获并处理ClassCastException
(这在上面提到的答案中没有显示,但是添加起来很简单),或者永远使用它。
答案 1 :(得分:1)
如果您不知道哪些类可用,也不知道它们具有什么样的界面,那么您使用它们的可能性很小(人们很难知道界面)
通常这个“扩展”模块被编码为特定的接口,因此新加载的类将始终具有某些方法(即,JDBC驱动程序总是希望找到PreparedStatement
实现,ResultSet
等等,即使它不知道下面还有什么)
在您的情况下,如果您想加载和使用任意类,我看到的唯一剩余资源是提供一些机制来向已发现的接口添加脚本语言(例如Groovy,Jython或JRuby)和代码。