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

Java 如何查找实现接口的枚举是否覆盖了这些方法?,java,reflection,enums,Java,Reflection,Enums,我正在尝试使用反射来确定哪些类型的枚举数对需要发送的数据有效。结构如下。我将MyEnum类型作为我的服务的输入,它会通知我正在处理的请求类型以及我需要做什么来处理这些数据 因此,我通过以下方式检查他们给我的值是否与MyEnum匹配: return value != null ? MyEnum.valueOf(value.trim().toUppercase()) != null : false; 但是,我不验证他们请求的MyEnum实例是否有method1和method2实现,或者它是否会默认

我正在尝试使用反射来确定哪些类型的枚举数对需要发送的数据有效。结构如下。我将MyEnum类型作为我的服务的输入,它会通知我正在处理的请求类型以及我需要做什么来处理这些数据

因此,我通过以下方式检查他们给我的值是否与MyEnum匹配:

return value != null ? MyEnum.valueOf(value.trim().toUppercase()) != null : false;
但是,我不验证他们请求的MyEnum实例是否有method1和method2实现,或者它是否会默认抛出UnsupportedOperationException。我尝试对类进行反射以收集覆盖注释,但我不知道如何反射在诸如类型\ A或类型\ 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 {
    };
}  
您可以使用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

因此,您可以知道方法栏已被过度使用。

您能否详细说明一下您试图通过此方法实现的目标?我觉得这里有一种设计的味道。我们的应用程序接受不同的文件类型,并根据给定的文件类型处理不同的请求。例如:CSV、KML、TXT、PDF、ZIP等。第一个接口方法定义如何将该文件类型验证为输入。第二个接口方法定义如何创建请求的文件类型。如输入为CSV,输出文件为CSV,或输入为TXT,输出文件为PDF等。。我试图在这里简单地回答这个问题,而不使用我真正的代码,因为我有很多与我的问题无关的特定代码。嗯,我可能不会直接在枚举中定义代码,而是将它作为一个标记来获得正确的处理程序,然后它将是不同的类。但是除此之外,你就不能实现标识默认方法吗,也就是说,什么都不做的方法取决于该方法的“什么都不做”的定义,例如,验证可以只返回true并无论如何调用它们?我最初把它们作为单独的类,但是我正在配置代码,以便最终所有类型都能与它们自己兼容,我不需要像CSV2CSV、CSV2KML和CSV2TXT这样的一堆类。然后,如果我将默认设置为不执行任何操作并调用该方法,并且实现了它,我不希望该过程运行。只有在我能够确保重写的实现不会被执行的情况下,我才可以调用该方法。