mab*_*abn 6 java reflection hibernate variadic-functions
所以,我有一个奇怪的问题.此表达式:method.invoke(target, null)throws java.lang.IllegalArgumentException:参数数量错误
问题是这个表达式在hibernate内部很深(确切地说是BasicPropertyAccessor $ BasicGetter),我想它应该可以正常工作(直到最近才这样做)
我在eclipse中调试了这个问题,事实上,如果我(在显示视图中)调用method.invoke(target)或method.invoke(target, (Object[]) null)一切正常.我确信我的班级有这个吸气剂,它没有任何争论.所以...问题是,到底发生了什么?!
编辑:
hibernate中的代码(BasicPropertyAccessor:143):
public Object get(Object target) throws HibernateException {
try {
return method.invoke(target, null);
}
catch{ ... }
}
Run Code Online (Sandbox Code Playgroud)将null值传递给varargs方法时,它可以解释为以下两种情况之一:
null数组null.除非null明确地转换为varargs方法的组件类型,否则Java会选择前者.(为了清楚起见,建议你明确地使用任何一种方法,如果你不这样做,你也会在Eclipse中得到一个令人讨厌的警告.)
在调用不带参数的方法时,您可以传递Method.invoke一个包含0个元素的数组,没有额外的参数(这将导致一个空数组)或一个null数组:
public class MethodInvoke {
public static void noParams() {
System.out.println("noParams called");
}
public static void main(String[] args) throws NoSuchMethodException,
SecurityException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException {
Method noParams = MethodInvoke.class.getMethod("noParams");
Object target = null;
noParams.invoke(target, new Object[0]);
noParams.invoke(target);
noParams.invoke(target, null);
noParams.invoke(target, (Object[]) null);
noParams.invoke(target, (Object) null); // wrong number of arguments
}
}
Run Code Online (Sandbox Code Playgroud)
似乎正在发生的事情method.invoke(target, null)被解释为method.invoke(target, (Object) null).这与Java应该如何表现不一致.
你绝对确定你的方法没有参数吗?
我还注意到,在更新版本的hibernate中,他们明确地将其转换null为Object[].
| 归档时间: |
|
| 查看次数: |
7207 次 |
| 最近记录: |