gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:58:12 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com