不同类的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帮助,因为这些类没有任何超类或超接口类型