在java反射tutorial page上,该示例包含此代码段
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的正确方法是什么?
提前感谢您的帮助。
答案 0 :(得分:1)
看起来这个例子有缺陷。对Locale.class.isAssignableFrom(pType[0].getClass())
的调用返回false,因为Type.getClass()
正在返回Class
而不是Locale
。这意味着if语句永远不会成为真,因为Type的getClass()
方法似乎总是返回Class
。
如果你像这样在类中添加一个新方法:
private boolean testBar2(int l) { return true; }
这会导致程序抛出IllegalArgumentException,因为它会调用testBar2,即使该类型不是Locale。
Type
是一个界面,调用pType[0].getClass()
要求获得pType[0]
的课程,Class
(不是Locale
),因为{{1}实现Class
接口。要找出Type
对象所代表的类,我们只能使用其Type
方法并查看它是否为“类java.util.Locale”,因为接口中没有特定于类型的方法。 / p>
简而言之,我认为他们使用toString
似乎无效,因此他们对其使用的讨论也是错误的。
答案 1 :(得分:0)
我认为这可能是对的:
if ((pType.length != 1) || !Locale.class.isAssignableFrom((Class<?>) pType[0])) {
continue;
}