在Java中,Foo.class.getMethod("bar")
声明了NoSuchMethodException
类型的已检查异常(等等)。
此例外的目的是什么?我没有返回null
足以表明找不到它吗?什么信息或实用程序会引发异常?除了强迫用户明确意识到它无法找到它之外,这似乎是多余的。当某些东西不存在时返回null
是Java中的一种常见模式,这似乎是它的主要候选者。那背后的原因是什么呢?
答案 0 :(得分:1)
似乎Java API的设计者区分了可以提出缺少某些内容的情况以及当您只询问存在的内容时的情况。
他们认为在Map.get
中要求丢失密钥是可以的,因为地图的内容是程序在运行时控制的。因此,类库的设计者认为在调用null
之前要求程序员检查某个值是否存在是不合理的,并决定返回getMethod
。
但是,在特定运行期间,类中的方法列表始终保持静态,因此请求程序员仅针对存在的方法调用Method
是合理的。这种方法有两个后果:
getMethod
反射对象不检查单个getMethods()
来电的返回值,Class
- 您仍然可以通过从class Plugin {
private final Method init;
private final Method start;
private final Method stop;
public Plugin(Class cl) throws PluginException, SecurityException {
try {
init = cl.getMethod("init");
start = cl.getMethod("start");
stop = cl.getMethod("stop");
} catch (NoSuchMethodException ex) {
throw new PluginException("Plugin is missing a required method", ex);
}
}
...
}
对象获取完整列表来检查所有方法,而无需知道其名称这是一个代码示例来说明第一点。当前的API允许你写这个:
class Plugin {
private final Method init;
private final Method start;
private final Method stop;
public Plugin(Class cl) throws PluginException, SecurityException {
init = cl.getMethod("init");
if (init == null) {
throw new PluginException("Plugin is missing init method");
}
start = cl.getMethod("start");
if (start == null) {
throw new PluginException("Plugin is missing start method");
}
stop = cl.getMethod("stop");
if (stop == null) {
throw new PluginException("Plugin is missing stop method");
}
}
...
}
而不是:
{{1}}