如何查找实现接口的枚举是否覆盖了这些方法?

时间:2018-02-01 13:49:03

标签: java reflection enums

我正在尝试使用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 {
    };
}  

1 个答案:

答案 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已被覆盖。