【问题标题】:How to find if an enum implementing an interface has overriden the methods?如何查找实现接口的枚举是否覆盖了方法?
【发布时间】:2018-02-01 13:49:02
【问题描述】:

我正在尝试使用反射来确定哪些类型的枚举器对我需要发送的数据有效。结构如下。我将 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 {
    };
}  

【问题讨论】:

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

标签: java reflection enums


【解决方案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已经被覆盖了。

【讨论】:

    猜你喜欢
    • 2015-04-29
    • 2016-09-23
    • 2014-07-11
    • 1970-01-01
    • 2021-07-18
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多