Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不同类的Java关联实例检查_Java_Reflection - Fatal编程技术网

不同类的Java关联实例检查

不同类的Java关联实例检查,java,reflection,Java,Reflection,我有一个方法,它将类内引用作为参数,如下所示: getConfigModule(Class klass) { //logic to check the class types } getConfigModule(ClassA.class); getConfigModule(ClassB.class); getConfigModule(ClassC.class); 我们从其他类调用此方法,如下所示: getConfigModule(Class klass) {

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

getConfigModule(Class klass) {
    //logic to check the class types
}
    getConfigModule(ClassA.class);
    getConfigModule(ClassB.class);
    getConfigModule(ClassC.class);
我们从其他类调用此方法,如下所示:

getConfigModule(Class klass) {
    //logic to check the class types
}
    getConfigModule(ClassA.class);
    getConfigModule(ClassB.class);
    getConfigModule(ClassC.class);

我需要在方法中编写一些逻辑来检查“klass”是否属于特定的类类型。例如,要检查“klass”的类型是ClassA和ClassB。

使用
Foo.class.isAssignableFrom(klass)或klass.isAssignableFrom(Foo.class)
,如果同一类型的意思是类
Foo
klass
的超类或超接口,或者相反


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

使用
Foo.class.isAssignableFrom(klass)或klass.isAssignableFrom(Foo.class)
如果用同样的类型,你的意思是类
Foo
klass
的超类或超接口,反之亦然


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

就像@RannLifshitz提到的那样,最直接的方法是使用
If-then-else-If
切换方法。如果您知道只有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
}
这将有助于您修改代码。例如,如果有人使用全新的类调用方法,他将得到INFORMATIVE异常。此外,您还可以为枚举使用一些标准功能,例如
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
}
//将是一个字段
私有EnumSet commonOption=EnumSet.of(类A,类B);
//代码中的某个地方
if(commonOption.contains(PossibleClasses.fromClass(klass)){
//这两个类通用的说明
}


同样,对于长期项目来说,使用enum是个好主意。对于启动或教育/调查项目,您很可能无法从这些额外的代码行中获得好处。

如@@RannLifshitz所述,最直接的方法是使用
if-then-else-if
切换
方法。如果您知道只有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
}
这将有助于您修改代码。例如,如果有人使用全新的类调用方法,他将得到INFORMATIVE异常。此外,您还可以为枚举使用一些标准功能,例如
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
}
//将是一个字段
私有EnumSet commonOption=EnumSet.of(类A,类B);
//代码中的某个地方
if(commonOption.contains(PossibleClasses.fromClass(klass)){
//这两个类通用的说明
}


同样,对于长期项目来说,使用enum是个好主意。对于启动或教育/调查项目,您很可能无法从这些额外的代码行中获得好处。

似乎这里的简单而暴力的方法是使用instanceof…这些类是否共享一个公共(和有区别的)超类?如果是,,只需将参数类型设置为
Class@AndyTurner:处理多接口实现时可能会出现问题此帮助是否有助于
ClassA.class==klass
?使用ClassA.class==klass帮助,因为我没有任何超类或超接口类型用于这些类,就像这里使用的普通和暴力方法一样这些类是否共享一个公共(且有区别)超类?如果是,只需将参数类型设置为
Class@AndyTurner:在处理多个接口实现时可能会出现问题此帮助是否
ClassA.class==klass
?使用ClassA.class==klass帮助,因为这些类没有任何超类或超接口类型