Java 我在学反射的时候,遇到可变长度参数列表,具体的成员方法就是?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 我在学反射的时候,遇到可变长度参数列表,具体的成员方法就是?相关的知识,希望对你有一定的参考价值。

Java 我在学反射的时候,遇到可变长度参数列表,具体的成员方法就是,请问Object[] parameters = new Object[] new String[] "卧槽,","牛逼! ","你真强" ; 啥意思?
具体代码简略如下:
需要被测试的类 Example :
package Test;
public class Example
public String myMethod(String... strings)
System.out.println("excute myMethod()");
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < strings.length; i++)
stringBuffer.append(strings[i]);


return stringBuffer.toString();



反射测试类Mykate如下,调用Example类的myMethod()方法:
package Test;
import java.lang.reflect.Method;
public class Mykate
public static void main(String[] args)
Example example = new Example();
Class<? extends Example> exampleC = example.getClass();
try
Method[] declaredMethods = exampleC.getDeclaredMethods();
for (int i = 0; i < declaredMethods.length; i++)
Method method = declaredMethods[i];
Object[] parameters = new Object[] new String[] "卧槽,", "牛逼! ", "你麻痹真强" ;
System.out.println("返回值为: " + method.invoke(example, parameters));

catch (Exception e)
e.printStackTrace();





输出结果为:
excute myMethod()
返回值为: 卧槽,牛逼! 你麻痹真强

首先,可变长度参数列表就是一个数组。
观察Method
类的方法Object invoke(Object obj, Object... args);
可以发现 参数obj是要执行的对象,args是方法的参数。
method.invoke(example, parameters)的意思是执行对象example的指定方法,这个方法接收参数为数组parameters中的元素。
方法myMethod只有一个参数:字符串数组。如果method.invoke(example, new String[] "卧槽,", "牛逼! ", "你麻痹真强" ),系统会以为你要执行myMethod(String str1,String str2,String str3)。但是Example类没有这个方法,所以会报错。如果invoke(example, new Object[] new String[] "卧槽,","牛逼! ","你真强"),就是告诉系统,你要找的是myMethod(String[] strs),由于可变参数等价于数组,于是找到了了Example类中的myMethod(String... strings)。追问

谢谢您🙏

谢谢您🙏

参考技术A myMethod(String... strings) 这个函数的参数是不定个数的字符串,
所以传进去的是String[],两者是等效的
参考技术B 你好,从问题描述中只能大概看出来是问java反射相关的问题。
但是看不出来具体是问什么问题。
建议重新组织下语言吧。

java可变参数长度

一:

在python中 有可变参数*args和万能参数**args参数分别为列表和字典。在java中也有类似的可变参数列表。不过传递进去的是可变参数数组。

 1 package com.company;
 2 
 3 public class Len_Chan_Args {
 4     public static void main(String[] args){
 5         Chan_Args chang=new Chan_Args();
 6         chang.chan_Args("tom","jack");
 7     }
 8 }
 9 
10 class  Chan_Args{
11     public void chan_Args(String x,String y){
12         System.out.printf("the string is %s %s",x,y);
13 
14     }
15 }

 其中printf()就是可变参数列表方法。我们看下源码;

可变参数的语法形式:object ... args用三个句点来表示这个方法接收的参数是可变。且可变参数位置未其他形参的最后。前一个为数据的类型,后一个args为参数的数组列表。

实际上object ... args表示object数组object[],当我们填写基本的整型的时候,会自动装箱传入Intger对象。在传入参数的时候,自动扫描字符串format,将其中的第i格式的说明符和object数组args[i]对应起来。

 1 public class Len_Chan_Args {
 2     public static void main(String[] args){
 3         Chan_Args chang=new Chan_Args();
 4         chang.chan_Args("tom","jack");
 5         System.out.printf("max number is %f",chang.max(1,2,3,5));
 6     }
 7 }
 8 
 9 class  Chan_Args{
10     public void chan_Args(String x,String y){
11         System.out.printf("the string is %s %s\\n",x,y);
12 
13     }
14     public  double max(double ... args){
15         double largest=Double.MIN_VALUE;
16         for (double x:args){
17             if(x>largest){
18                 largest=x;
19             }
20         }
21         return largest;
22     }
23 }

输出:

其中传入可变参数,args为数组。我们可以对其进行遍历。其中Double.MIN_VALUE为常量。为double类型的最小值。

 type ...  args可以写成type[] args形式。其中我们熟悉的main函数也可以这么写:

1 public class Len_Chan_Args {
2     public static void main(String ... args){
3         Chan_Args chang=new Chan_Args();
4         chang.chan_Args("tom","jack");
5         System.out.printf("max number is %f",chang.max(1,2,3,5));
6     }
7 }

 

以上是关于Java 我在学反射的时候,遇到可变长度参数列表,具体的成员方法就是?的主要内容,如果未能解决你的问题,请参考以下文章

Java可变参数

java反射机制之Method invoke执行调用方法例子

C++ 从可变长度参数列表中提取 std::string

java可变参数长度

如何使用只有一个参考参数的可变长度参数列表?

Java可变长度参数