java - 使用反射动态调用正确的正确设置方法

标签 java reflection enums

我正在使用一个我无法修改的库,它有一个包含以下 Enum 的类和二传手。

public class MyClass {
  public enum MyEnum {
    ClassA,
    ClassB,
    ClassC
    ...
  }

  private SomeEnum myEnum;
  private Interface ifc; // parent of ClassA, ClassB, ClassC, etc.

  public ClassA setClassA(ClassA classA) {
    ifc = classA;
    myEnum= SomeEnum.ClassA;
  }
  public ClassB setClassB(ClassB classB) {
    ifc = classB;
    myEnum= SomeEnum.ClassB;
  }
  public ClassC setClassC(ClassC classC) {
    ifc = classC;
    myEnum= SomeEnum.ClassC;
  }
  // ... more of these setters 
}

注意每个 Enum name 是实现 Interface 的相应类名的字符串文字匹配,以及每个类名如何有自己特定的 setter。

正如您想象的那样,调用它的代码非常简单:

Interface ifc = someCallToGetAnImpl();
MyClass myClass = new MyClass(); 
myClass.set???(ifc);

很多 Interface 的实现,而且我不能保证库的 future 版本不会添加更多。所以我希望创建一个可以动态派生和调用正确 setter 的函数。

当然,我可以 build 一个大的旧if... else if... block ,但这需要在新实现 Interface 时更改软件被 build 。我还考虑过使用 Class.getDeclaredMethod(String name, Class<?>... parameterTypes) 通过构建 name使用类似

的参数
"set" + ifc.getClass.getSimpleName()...

应该让软件保持动态,但看起来很笨拙。

欢迎任何干净的、生产质量的建议或方法。

最佳答案

您正在考虑的方法,通过 Class.getDeclaredMethod(String name, Class... parameterTypes) 等方法使用反射是解决您所描述问题的正确方法。这是一个笨拙的问题,值得采用笨拙的方法。

不过,我要补充的一件事是,您编写单元测试来验证您对该类中的模式的假设,这样如果他们添加了一个不遵循该模式的方法,您就会收到警告。例如,如果添加了一个新的枚举值,但没有方法支持它怎么办?你会希望自动提醒类似的事情。

关于java - 使用反射动态调用正确的正确设置方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32363177/

相关文章:

c# - 如何在我的程序中使用 .NET 类型字符串?

java - 使用 Java 反射返回所有 null

c#枚举协方差不起作用

java 枚举与数组属性

c++ - 将枚举类变量保存到 JSON

java - Java中如何找到方法调用的行号

java - 从 Controller 转发到静态 html 页面

java - 将泛型参数绑定(bind)到 Class<?> 时未经检查的强制转换

控制面板和终端之间的 Java 版本不匹配

java - 如何在以下场景中为模型的特定字段选择自定义序列化器