Функция varargs языка программирования Java позволяет вызывать метод, который поддерживает переменное число аргументов, как обычный метод с n аргументами в исходный код . Это не связано с вашим намерением разрешить произвольное количество аргументов в командной строке .
На самом деле, эта функция исходного кода даже не нужна для вашей операции. Вы получаете аргументы командной строки в массиве, длина которого отражает их число. Вы можете проверить длину массива, используя args.length
.
public class Test {
public static void main(String[] args) {
if(args.length == 0) {
System.err.println("specify <className> args...");
System.exit(1);
}
String className = args[0];
// remove the first element
args = Arrays.copyOfRange(args, 1, args.length);
Class<?> theClass;// don't initialize with null
try {
theClass = Class.forName(className);
}
catch(ClassNotFoundException e) {
e.printStackTrace();
System.exit(1);
throw new AssertionError(); // unreachable point
}
// constructor accepting n strings
Class<?>[] argTypes = new Class[args.length];
Arrays.fill(argTypes, String.class);
try {
Constructor<?> c = theClass.getConstructor(argTypes);
Object o = c.newInstance((Object[])args);
System.out.println("created " + o);
} catch(ReflectiveOperationException e) {
e.printStackTrace();
System.exit(1);
}
}
}
Вызов newInstance
не использует функцию varargs, так как на уровне исходного кода у нас уже есть массив. Фактически, приведение (Object[])
существует, чтобы сделать явным то, что мы не хотим использовать функцию varargs, то есть мы не хотим вызывать конструктор, принимающий единственный аргумент массива, но конструктор, принимающий столько строковых аргументов, сколько массив содержит.
Обратите внимание, что код вашего примера newInstance(new Object[]{"first", "second"," more"})
также не использовал varargs, так как он явно создает массив, вызывая newInstance(Object[])
так же, как решение этого ответа. Вызов varargs будет newInstance("first", "second"," more")
, который работает, только если мы знаем, что во время компиляции конструктор ожидает три строковых аргумента.