我正在使用一个我无法修改的库,它有一个包含以下 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/