繁体   English   中英

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

[英]Get the number of variable arguments of a method in java

当心以下潜在的愚蠢问题:

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

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

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

附注。 这很重要 - 我不是在谈论获取(字符串...参数) - 没有这样的事情 - 当有人调用您的方法时,它使用实际参数,“字符串...参数”无法获取和得到它的长度。

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

对于这样的事情:

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)?

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

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

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

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

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

听起来您想要访问传递到将可变参数作为参数的不同方法( String.format()方法)的参数数量。

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

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

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

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

我想了很多,为此我想出了一个解决方案,这个解决方案非常简单。 事实上,我在 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);
    }
}

对象类:

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”。

它就像一个魅力。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM