获取java中方法的变量参数的数量

时间:2017-01-31 14:52:27

标签: java variadic-functions string.format

请注意以下潜在的愚蠢问题:

我有一个使用String.format()方法格式化某些文本的方法。目前,它接收两个参数,所以我有两个“%s”参数来创建我想要的任何文本。

但有人可能想使用我的方法使用3个参数,或4或100。如何将传递的参数的长度作为varargs获取到String.format()方法的长度,以便在传递3个参数的情况下,将有3个“%s”而不是当前的2个;或4或100。

如何获取传递给String.format()方法的参数数量,以便其中的文本根据需要自动添加“%s”?因为参数只是作为常规参数传递,而不是作为数组或类似的传递。如何获取参数数组的长度?

PS。这很重要 - 我不是在谈论获取(String ...参数) - 没有这样的事情 - 当有人调用你的方法时,它使用实际参数,“String ... arguments”不可用于抓取和获得它的长度。

我意识到这是一个配置不当的问题,因为我没有在我面前的代码进一步解释,但这已经困扰了我很长一段时间 - 你如何获得传递给方法的参数数量?

对于这样的事情:

String.format(SomeObject.SomeString, param1, param2,...,param 100)

编辑:SomeObject.SomeString声明如下:

String SomeString = "Blah blah %s blah blah blah %s";

因此它有两个正在硬编码的参数。

当有人使用它时,如何自定义SomeObject.SomeString以便它“知道”已将多少参数传递给String.format()方法(以便SomeObject.SomeString知道要添加多少%s动态地)?

4 个答案:

答案 0 :(得分:8)

  

因为参数只是作为常规参数传递,而不是作为数组传递。

不,这些值是作为数组传递的,因此您可以编写

public String myVarags(String... args) {
    String s = "";
    for(int i = 0;i < args.length; i++)
        s += "%s ";
    return String.format(s, args);
}

它将为每个参数生成String %s,然后使用给定值格式化String。这也是一种非常愚蠢和无用的方法。

varargs符号只是语法糖,它在运行时是一个数组。

答案 1 :(得分:4)

听起来你想要访问传递给另一个方法的参数数量,该方法将vararg作为参数(String.format()方法)。

如果无法更改方法内的代码,则无法知道有多少参数传递给方法。 String参数肯定不知道传入了多少参数。它是一个完全独立的对象。

你唯一能做的就是创建一个包装器方法。您可以使用相同的varargs,然后将它们传递给String.format()方法,进行您想要做的任何更改。

然后调用String.format()的任何代码都需要调用你的包装器方法。

示例:

public String StringFormatWrapper(String...args) {
    //perform actions on the args
    if (args.length > 1) 
        args[1] = "Hello World";

    //call the String.format() method
    return String.format(args)
}

如果您无法访问正在呼叫String.format()的内容,那么您想要做的就是不可能。

答案 2 :(得分:0)

我不认为你问的是可能的,因为你的SomeObject.SomeString只是一个论点,它对其他论点一无所知。你可以做的是将你的参数变成一个varargs数组,并在SomeObject上创建一个方法来生成正确的字符串:

String[] args = ...
String.format(SomeObject.createSomeString(args.length), args);

答案 3 :(得分:-1)

我已经考虑了一点,我已经为此提出了解决方案,解决方案非常简单。事实上,我在5分钟内写完了它。

这是怎么回事:

主要课程:

public class Main {

    SomeObject someObject = new SomeObject();

    public static void main(String[] args) {

        Main main = new Main();
        main.formatString("a","b","c","D","efesfs");

    }

    public void formatString(String...varargs){
        String formattedString = String.format(someObject.returnFormattedString(varargs.length), varargs);
        System.out.println(formattedString);
    }
}

SOMEOBJECT CLASS:

public class SomeObject {

    public String someString = "Blah blah blah";

    public String returnFormattedString(int numberOfArguments){
        for (int i = 0; i<numberOfArguments; i++){
            someString += "%s";
        }

        return someString;
    }
}

换句话说,我将所有内容包装在一个方法中,该方法可以访问多少个参数作为参数传递,并且我将它们的数量(作为varargs.length)传递给SomeObject内部的方法将长度作为int变量并使用for循环的类将根据需要添加“%s”。

它就像一个魅力。

我知道有些人批评我这不是“正确”,“这不是问题的正确问题”等等,但至少它有一个简单的解决方案,就像我认为应该有的那样,而且它不是“不可能“,你不需要在运行时分解字节码或任何疯狂的东西。