我有两个java jar应用程序。有一个名为CommonClass的类,它包含一个枚举:
public class CommonClass {
public enum myEnum {
NAME(0), TYPE(1), DESCRIPTION(2), OPTIONAL(3);
private int value;
private myEnum(int value) {
this.value = value;
}
public int getValue() {
return this.value;
}
}
}
第一个jar有这个类(first.jar.CommonClass),第二个jar有它 (any.package.CommonClass)。
在运行第一个应用程序时,我想在某个时候比较myEnum值。 我可以通过解析清单从第二个应用程序类加载主类的实例,以便找到主类名。
理论上,我想这样做:
if( any.package.CommonClass.myEnum.NAME.getValue() == first.jar.CommonClass.myEnum.NAME.getValue() ) {
// Do something
}
我该怎么做?
编辑1
问题是:第一个应用程序是某种应该读取未知插件的平台。应根据一些约定来开发这些插件以实现兼容性。但是,没有办法告诉插件开发人员想要将CommonClass放在哪个包中。
第二个应用程序就是这样一个插件。要查找并加载其主类,我解析清单。在练习中,我不知道CommonClass的路径。
这就是为什么我无法导入任何包,因为首先我不知道将使用哪个插件,其次我对jar文件中的CommonClass位置知之甚少。
答案 0 :(得分:1)
最简单的方法是在您的类路径中包含两个jar,并使用您在问题中发布的代码。
如果由于某些原因,这不是一个选项,因此在编译时类型不可用,您需要反射。但是,您不需要解析清单,也不需要从jar文件加载main-class,只是为了访问jar中的enum
类。您可以通过用于加载主类的第二个主类跳过加载的enum
来访问ClassLoader
类:
ClassLoader loader; // the loader you have used for your second jar’s main class
Class<?> second=loader.loadClass(typeName);
assert second.isEnum();
Object enumConst=Enum.valueOf(second, "NAME");
int value=(Integer)second.getMethod("getValue").invoke(enumConst);