比较不同jar中普通类的值

时间:2014-08-04 10:18:14

标签: java jar enumeration

我有两个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位置知之甚少。

1 个答案:

答案 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);