在java反射教程页面上,示例有以下片段
if ((pType.length != 1) ||
Locale.class.isAssignableFrom(pType[0].getClass())) {
continue;
}
"此外,Class.isAssignableFrom()用于确定所定位方法的参数是否与所需调用兼容。"
我以为这个片段试图找到以Locale为参数的方法。然而,它正在尝试查找Locale.class.isAssignableFrom(pType[0].getClass())并跳过。有趣的是,当pType[0]为Locale时,Locale.class.isAssignableFrom(pType[0].getClass())返回false,因此该示例可以按描述工作。
有人知道当pType[0]为Locale时,Locale.class.isAssignableFrom(pType[0].getClass())为什么会返回false吗?检查该方法的参数是否为Locale的正确方法是什么?
提前感谢您的帮助。
这个例子看起来有缺陷。对Locale.class.isAssignableFrom(pType[0].getClass())
的调用返回false,因为Type.getClass()
返回的是Class
而不是Locale
。这意味着if语句永远不会为真,因为Type的getClass()
方法似乎总是返回Class
。
如果您向类中添加一个新方法,如下所示:
private boolean testBar2(int l) { return true; }
这将导致程序抛出IllegalArgumentException,因为即使类型不是Locale,它也会调用testBar2。
Type
是一个接口,调用pType[0].getClass()
要求获得pType[0]
的类,即Class
(而不是Locale
),因为Class
实现了Type
接口。为了找出Type
对象代表的类,我们只能使用它的toString
方法,看看它是否是"类java.util.Locale",因为接口中没有特定于类型的方法。
总之,我认为他们对isAssignableFrom
的使用在这里似乎是无效的,因此他们对其使用的讨论也是错误的。
我认为这可能是对的:
if ((pType.length != 1) || !Locale.class.isAssignableFrom((Class<?>) pType[0])) {
continue;
}