gpt4 book ai didi

java - 有没有一种非异常的方式来访问 getDeclaredMethod?

转载 作者:行者123 更新时间:2023-11-30 05:43:18 25 4
gpt4 key购买 nike

我有两个对象,我可能需要调用方法,但我不知道它属于哪一个。现在,我的基本工作流程是这样的:

Method method = null;
Target target = null;
try {
method = first.getClass().getDeclaredMethod(methodName, typeParams);
target = first;
} catch(NoSuchMethodException e) {
try {
method = second.getClass().getDeclaredMethod(methodName, typeParams);
target = second;
} catch(NoSuchMethodException e1) {
// they sent us a bad command, return 404-esque response
}
}
method.invoke(target, arguments);

我真的很想避免像这样的所有异常处理,因为没有方法并不是真正的异常,而是一种期望。理想的情况是

if(first.getClass().hasDeclaredMethod(methodName, typeParams)) {
return first.getClass().getDeclaredMethod(methodName, typeParams).invoke(first, arguments);
}
if(second.getClass().hasDeclaredMethod(methodName, typeParams)) {
return second.getClass().getDeclaredMethod(methodName, typeParams).invoke(second, arguments);
}
// they sent us a bad command, return 404-esque response

有哪些选项可以通过这种方式减少对异常的依赖?我不想编写“包装方法”,因为这些方法可能很麻烦并且很难判断何时发生错误。

最佳答案

当你不想捕获异常时,你必须实现搜索,即

public static Optional<Method> getMethod(Class<?> decl, String name, Class<?>... arg) {
return Arrays.stream(decl.getDeclaredMethods())
.filter(m -> name.equals(m.getName()) && Arrays.equals(m.getParameterTypes(), arg))
.findAny();
}

你可以这样使用

Optional<Method> m = getMethod(target.getClass(), methodName, typeParams);
if(!m.isPresent()) {
target = second;
m = getMethod(target.getClass(), methodName, typeParams);
}
if(m.isPresent()) try {
m.get().invoke(target, args);
}
catch (IllegalAccessException|InvocationTargetException ex) {

}

虽然使用选项的其他方式也是可能的。

你可能会想说“等等……但这会在所有声明的方法中进行线性搜索”,但是,没有人 promise getDeclaredMethod(String, Class<?>...)比线性搜索做得更好,事实上,在广泛使用的引用实现中,它并没有。它所做的搜索与上面显示的逻辑相同,除了如果没有找到匹配项则在最后抛出异常。

即使确实如此,例如在哈希查找中,创建新异常的成本可能超过通过有限数量的声明方法进行线性搜索的成本。

关于java - 有没有一种非异常的方式来访问 getDeclaredMethod?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55286126/

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