Java 比较不同jar中公共类的值

Java 比较不同jar中公共类的值,java,jar,enumeration,Java,Jar,Enumeration,我有两个javajar应用程序。有一个名为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;

我有两个javajar应用程序。有一个名为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放在哪个包中

第二个应用程序就是这样一个插件。为了找到并加载它的主类,我解析清单。在实践中,我不知道平民阶级的道路


这就是为什么我不能导入任何包,因为首先我不知道将使用哪个插件,其次我对jar文件中CommonClass的位置知道得更少。

最简单的方法是将两个jar都包含在类路径中,只使用您在问题中发布的代码

如果由于某些原因,这不是一个选项,因此该类型在编译时不可用,则需要进行反射。但是,您不需要解析清单,也不需要从jar文件加载主类,只需要从jar中访问
enum
类。您可以通过与加载第二个主类相同的
ClassLoader
访问
enum
类,跳过加载主类:

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);
ClassLoader;//用于第二个jar主类的加载程序
第二个类=loader.loadClass(typeName);
断言second.isEnum();
对象enumcont=Enum.valueOf(第二个“名称”);
int value=(整数)second.getMethod(“getValue”).invoke(枚举常量);

您建议的代码看起来不错-到底是什么问题?是的,为什么需要解析清单?为什么你不能把第二个jar放在clasp路径上并导入它呢?问题是第一个应用程序是一种平台,它应该读取未知的插件,这些插件应该按照以下兼容性约定开发。但是没有办法告诉插件开发者要将CommonClass放在哪个包中。第二个应用程序就是这样一个插件。为了加载它的主类,我解析清单。在实践中,我不知道CommonClass的路径。谢谢,这个解决方案很好用!但是,我在私有final方法中将每个枚举转换为整数,从而在不加载COmmonClass的情况下忽略了我的问题。因此,插件开发人员不必接触此方法,兼容性仍然得到保证:)