Java Relection实例检查不同的类

时间:2018-02-15 07:32:37

标签: java reflection

我有一个方法,它将类引用作为参数,如下所示:

getConfigModule(Class klass) {
    //logic to check the class types
}

我们从其他类调用此方法,如下所示:

    getConfigModule(ClassA.class);
    getConfigModule(ClassB.class);
    getConfigModule(ClassC.class);

我需要在方法中写一些逻辑来检查" klass"是否属于某种类型。例如,检查" klass"属于ClassA和ClassB。

2 个答案:

答案 0 :(得分:2)

与@@ RannLifshitz一样,最简单的方法是if-then-else ifswitch方法。如果你知道只有3个选项,可以打赌什么都不会添加,那就没关系。

对于长期项目,可以使用枚举方式。

public enum PossibleClasses {
    CLASS_A(ClassA.class), CLASS_B(ClassB.class);
    Class klass;

    PossibleClasses(Class klass) {
        this.klass = klass;
    }

    static PossibleClasses fromClass(Class desiredClass) {
        for (PossibleClasses current:PossibleClasses.values()) {
            if (current.klass == desiredClass) {
                return current;
            }
        }
        // here you could implement logic regarding class inheritance or something else.
        throw new IllegalArgumentException("Uknown class:"+desiredClass);
    }
}

然后与枚举值而不是Class进行比较。

if (PossibleClasses.fromClass(klass) == CLASS_A) {
  //do something
}

当您修改代码时,这将有所帮助。例如,如果某人使用全新的类调用方法,他将获得异常。此外,您可以使用EnumSet等枚举的一些标准功能来清除代码,例如

// would be a field
private EnumSet<PossibleClasses> commonOption =  EnumSet.of(CLASS_A, CLASS_B);

// somewhere inside code
if (commonOption.contains(PossibleClasses.fromClass(klass))) { 
   // instructions which are common for both classes
}

再次,使用枚举是长期项目的好主意。对于启动或教育/调查项目,您很可能无法从这些额外的代码行中获益。

答案 1 :(得分:0)

使用Foo.class.isAssignableFrom(klass) or klass.isAssignableFrom(Foo.class)如果相同类型,则表示类Fooklass的超类或超接口,或者相反。

如果你想要严格的平等,只需使用equals方法。