[英]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.