我遇到了我维护的插件的问题,因为在我们的应用程序的下一个版本中,我需要从插件中访问的集合将类型从Hashset更改为ArrayList。
我需要的是为我的插件添加一个jar,它可以访问主应用程序中的集合,无论版本/集合类型如何。
目前如果我针对V1编译我的插件(使用Hashset),插件将加载到V1和V2,但在尝试访问V2上的该集合时挂起
如果我针对V2(使用ArrayList)编译我的插件,插件将加载到V1和V2上,但在尝试访问V1上的该集合时挂起
我能够使用反射来解决这个问题。 我不确定它是最好还是最快的方法,但它现在似乎工作正常...
List<MainPurpose> listOfMps = new ArrayList<MainPurpose>();
try {
Method getMps = cs.getContact().getClass().getMethod("getMainPurposes", (Class<?>[]) null);
if (getMps.getReturnType().isAssignableFrom(Set.class)) {
Set<MainPurpose> mps = (Set<MainPurpose>) getMps.invoke(cs.getContact(), (Object[]) null);
listOfMps.addAll(mps);
} else if (getMps.getReturnType().isAssignableFrom(List.class)) {
List<MainPurpose> mps = (List<MainPurpose>) getMps.invoke(cs.getContact(), (Object[]) null);
listOfMps.addAll(mps);
}
} catch (Exception e) {}