我正在尝试使用Reflection来确定哪些类型的枚举器对我需要发送的数据有效。结构如下。我将MyEnum类型作为我服务的输入,告诉我我正在处理什么类型的请求以及我需要做什么才能处理数据。
所以我检查他们给我的价值是否与MyEnum匹配:
return value != null ? MyEnum.valueOf(value.trim().toUppercase()) != null : false;
但是,我不验证他们请求的MyEnum实例是否具有method1和method2实现,或者它是否默认抛出UnsupportedOperationException。我尝试在类上进行反射以收集Override注释,但我不知道如何反映在类似于TYPE_A或TYPE_B的烦人枚举类中声明的方法。我的反思尝试继续扫描MyEnum.class而不是我想要的烦人的类。
如何在不调用方法的情况下检查实现是否存在?这是我的代码。
public interface MyEnumInterface {
default MyRequest method1(MyRequest request){
throw new UnsupportedOperationException("The operation you are trying to do is not yet supported!");
}
default boolean method2(MyRequest request){
throw new UnsupportedOperationException("The operation you are trying to do is not yet supported!");
}
}
public enum MyEnum implements MyEnumInterface {
TYPE_A {
@Override
public MyRequest method1(MyRequest request){
// Logic
request.setStatus("SAVING");
return MyRequestService.persist(request);
}
@Override
public boolean method2(MyRequest request){
request.setStatus("PROCESSING");
// Logic...
return true;
}
},
TYPE_B {
@Override
public MyRequest method1(MyRequest request){
// Different Logic...
return request;
}
},
TYPE_C {
};
}
答案 0 :(得分:1)
您可以使用Method.getDeclaringClass
。
例如:
interface Inter {
default void foo() {
System.out.println("Q48564340.Inter.foo()");
}
default void bar() {
System.out.println("Q48564340.Inter.bar()");
}
}
enum Enum implements Inter {
A {
@Override
public void foo() {
System.out.println("Q48564340.Enum.A.{...}.foo()");
}
}
}
Method fooA = Enum.A.getClass().getMethod("foo");
Method barA = Enum.A.getClass().getMethod("bar");
System.out.println(fooA.getDeclaringClass() == Inter.class);// false
System.out.println(barA.getDeclaringClass() == Inter.class);// true
因此,您可以知道方法bar
已被覆盖。