varargs和null参数

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)一切正常.我确信我的班级有这个吸气剂,它没有任何争论.所以...问题是,到底发生了什么?!

编辑:

  • method是java.lang.reflect.Method的一个实例,并指向所述getter
  • target是具有公共X getX()getter的类的实例
  • JDK 1.6.0_31
  • hibernate中的代码(BasicPropertyAccessor:143):

    public Object get(Object target) throws HibernateException {
        try {
            return method.invoke(target, null);
        }
        catch{ ... }
    }
    
    Run Code Online (Sandbox Code Playgroud)

Jef*_*rey 8

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中,他们明确地将其转换nullObject[].