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

获取java中方法的变量参数数,java,variadic-functions,string.format,Java,Variadic Functions,String.format,请注意下面潜在的愚蠢问题: 我有一个方法,它使用String.format()方法格式化一些文本。目前,它接收两个参数,所以我有两个“%s”参数来创建我想要的任何文本 但是有人可能想在我的方法中使用3个参数,或者4个,或者100个。如何将传递给String.format()方法的参数的长度设置为varargs,这样,如果传递给它的参数有3个,那么将有3个“%s”,而不是当前的2个;或者4,或者100 如何获得传递给String.format()方法的参数数,以便其中的文本根据需要自动添加“%s”

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

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

但是有人可能想在我的方法中使用3个参数,或者4个,或者100个。如何将传递给String.format()方法的参数的长度设置为varargs,这样,如果传递给它的参数有3个,那么将有3个“%s”,而不是当前的2个;或者4,或者100

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

这很重要-我不是说获取(字符串…参数)-没有这样的事情-当有人调用您的方法时,它使用实际参数,“字符串…参数”无法获取和获取其长度

我意识到这是一个表述糟糕的问题,因为我面前没有代码可以进一步解释,但这困扰了我很长一段时间——如何获得传递给方法的参数数

对于这样的事情:

String.format(SomeObject.SomeString, param1, param2,...,param 100)
编辑:
SomeObject.SomeString
声明如下:

String.format(SomeObject.SomeString, param1, param2,...,param 100)
String SomeString=“诸如此类%s诸如此类%s”

所以它有两个参数被硬编码在里面

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

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

不,值作为数组传递,因此您可以写入

public String myVarags(String... args) {
    String s = "";
    for(int i = 0;i < args.length; i++)
        s += "%s ";
    return String.format(s, args);
}
公共字符串myVarags(字符串…args){
字符串s=“”;
对于(int i=0;i
它将为每个参数生成一个带有
%s
字符串
,然后用给定值格式化字符串。这也是一种非常愚蠢和无用的方法


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

我不认为你所要求的是可能的,因为你的
SomeObject.SomeString
只是一个参数,它对其他参数一无所知。您可以将参数转换为vararg数组,并在
SomeObject
上创建一个方法来生成正确的字符串:

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

听起来好像您想访问传递到另一个以vararg作为参数的方法(
String.format()
方法)中的参数数量

如果无法更改方法内部的代码,则不可能知道向方法传递了多少个参数。而
字符串
参数肯定不知道传入了多少个参数。这是一个完全独立的对象

您唯一能做的就是创建一个包装器方法。您可以使用相同的vararg,然后将它们传递给
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()
,那么您想要做的是不可能的。

我对此进行了更多的思考,并提出了一个解决方案,这个解决方案非常简单。事实上,我只用了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类:

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;
    }
}
公共类SomeObject{
公共字符串someString=“诸如此类”;
公共字符串returnFormattedString(int numberOfArguments){

对于(int i=0;这正是我想说的,它没有发生。当有人使用它时,它只是说
String.format(SomeObject.SomeString,param1)
或者它可以说
String.format(SomeObject.SomeString,param1,param2)
,实际数组永远不可用,因此您可以获取其长度-只有常规参数。如何获取方法的参数数量,“名称”是什么关于保存这些参数的数组?记住,我们只使用方法,而不是声明它或其他任何东西。我真的不确定这是如何回答这个问题的。他特别说:“PS。这很重要-我不是说获取(字符串…参数)-没有这样的事情-当有人调用你的方法时,它使用实际参数”。他想根据传递给
String.format
的其他参数修改
SomeObject.SomeString
。这完全正确。我想获得传递给String.format()的参数数量方法,例如修改SomeObject.SomeString,并使其适应传递给String.format()方法的参数数量。@RobertRuxandrescu为什么?这听起来根本不像使用
String.format()的正常方式
@Adam不,不可能。不过这看起来像是一个典型的XY问题。我只能想象他到底想做什么,他到底是怎么认为这是一个很好的解决方案的。知道传递给
String.format
的参数数量有什么用?如果你没有合适的参数数量r格式字符串,您将得到
MissingFormatArgumentException
;如果有太多,您将看不到额外的字符串。您唯一能做的就是将
args.length
作为显式参数传递给
string.format
调用。是的,这是一种非常奇怪的情况,我还想知道是否可以在