Object... values的用法

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

可变参数(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()),这样的代码比原来清楚了很多。

反射时的可变参数
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. 带可变参数的方法,在以反射的方式调用它时,必须把可变参数当数组处理!
	*/
}

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