Object... values的用法

public abstract List find(String hql, Object... values);
[color=blue]Object... values,你也可以认为是Object[] values,数组.[/color]

可变参数(Varargs)

  可变参数使程序员可以声明一个接受可变数目参数的方法。注意,可变参数必须是
函数声明中的最后一个参数。假设我们要写一个简单的方法打印一些对象,
util.write(obj1);
util.write(obj1,obj2);
util.write(obj1,obj2,obj3);

  在JDK1.5之前,我们可以用重载来实现,但是这样就需要写很多的重载函数,显得
不是很有效。如果使用可变参数的话我们只需要一个函数就行了
public void write(Object... objs) {
   for (Object obj: objs)
      System.out.println(obj);
}
  在引入可变参数以后,Java的反射包也更加方便使用了。对于
c.getMethod("test", new Object[0]).invoke(c.newInstance(), new 
Object[0])),现在我们可以这样写了
c.getMethod("test").invoke(c.newInstance()),这样的代码比原来清楚了很多。

[color=darkblue]反射时的可变参数[/color]
public class ReflectValues {
public static void main(String args[]) throws Exception{
//不使用发射,直接调用,可以运行
test("hehehe",9L,"heihei","heng");
test("hehehe",9L,new String[]{"heihei","heng"});

//运用发射,这样配置,可以运行
Method m = ReflectValues.class.getMethod("test", new Class[]{String.class,Long.class,String[].class});
m.invoke(null, new Object[]{"hehe",9L,new String[]{"heihei","heng","hah"}});//等价于m.invoke(null, "hehe",9L,new String[]{"heihei","heng","hah"});
m.invoke(null, new Object[]{"hehe",9L,"heihei","heng"});//这一行会报错java.lang.IllegalArgumentException: wrong number of arguments

//注意:以下不能运行,报java.lang.NoSuchMethodException异常
Method m2 = ReflectValues.class.getMethod("test", new Class[]{String.class,Long.class,String.class,String.class});
m2.invoke(null, "hehehe",9L,"heiheihei","hengheng");//上一行代码报错,这一行代码没有执行到呢
}

public static void test(String a,Long b,String...strings){
System.out.println(a);
System.out.println(b);
for(String s : strings){
System.out.println(s);
}
}

/**
* 总结 1. 可变参数的本质是数组! JVM将可变参数当做数组处理。
* 2. 带可变参数的方法,在以直接的方式调用它时,可以一个参数一个参数的传,也可以当成数组处理;
* 3. 带可变参数的方法,在以反射的方式调用它时,必须把可变参数当数组处理!
*/
}

你可能感兴趣的:(Java,C,C++,C#,Blog)