概要:
不定长参数实质是数组,它是一种语法糖,且遵守以下规则:
- 语法:数据类型...参数名 表示不定长参数,也成为可变长参数
- 特点:
- 只能是方法的最后一个参数
- 调用方法是参数的个数任意,也可以什么都不填
- 一个方法最多只能有一个可变长参数
- 本质上一种特殊的数组,只能作为方法的形参
具体实现方法:
下面是实际使用的例子:
public static void main(String[] args) throws Exception {
User user = new User(123,"","",25.33,true);
int num = 1000;
String str = "多余的钱";
testParam("admin");
testParam("system",user);
testParam("root",user,str,num);
byReflex(Test7.class,"test1");
byReflex(Test7.class,"test2",String.class ,"str" ,Integer.class, 15);
byReflex(Test7.class,"test3",String.class ,"str" ,Integer.class, 15,Boolean.class,true);
}
public static void testParam(String acct,Object... args){
//不定长参数实质是个数组
Object[] objects = args;
System.out.println("输入不定长参数的长度为:"+args.length);
//然后进行不定长参数的提取
StringBuilder builder = new StringBuilder();
for(Object x : args){
builder.append(String.valueOf(x));
}
System.out.printf("账户:%s 的相关信息为:%s %n",acct,builder.toString());
//System.out.printf("账户:%s 的相关信息为:%s %n",acct,args.toString());
}
//实际使用,根据反射来使用不定长参数
public static void byReflex(Class<?> className,String methodName,Object... args) throws Exception {
ArrayList<Class<?>> types = new ArrayList<>();
ArrayList<Object> params = new ArrayList<>();
if(args.length > 0 && args.length%2 ==0){
for(int num = 0; num < args.length;num++){
if(num%2 == 0){
types.add((Class<?>) args[num]);
}else{
params.add(args[num]);
}
}}
Object instance = className.newInstance();
Method method = className.getDeclaredMethod(methodName, types.toArray(new Class<?>[types.size()]));
method.setAccessible(true);
method.invoke(instance,params.toArray(new Object[params.size()]));
}
另一个测试类
package com.example.demo.Test;
//用来测试不定长参数的反射使用
public class Test7 {
public void test1(){
System.out.println("====come in test1===");
}
public void test2(String str ,Integer num){
System.out.printf("====come in test2===参数为:%s %n",str+String.valueOf(num));
}
private void test3(String str ,Integer num,Boolean flag){
System.out.printf("====come in test3===参数为:%s %n",str+String.valueOf(num)+String.valueOf(flag));
}
}
用到的User实体
package com.example.demo.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class User {
private Integer id;
private String name;
private String pwd;
private Double money;
private Boolean sex;
}