forked from joeferner/node-java
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathVarArgs.java
More file actions
43 lines (38 loc) · 1.86 KB
/
VarArgs.java
File metadata and controls
43 lines (38 loc) · 1.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package node;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Array;
import java.util.Arrays;
public class VarArgs {
public static Object[] getVarArgs(Method method, Object[] args) {
if (method.isVarArgs()) {
Class<?>[] methodParameterTypes = method.getParameterTypes();
return getVarArgs(args, methodParameterTypes);
}
return args;
}
public static Object[] getVarArgs(Constructor constructor, Object[] args) {
if (constructor.isVarArgs()) {
Class<?>[] constructorParameterTypes = constructor.getParameterTypes();
return getVarArgs(args, constructorParameterTypes);
}
return args;
}
public static Object[] getVarArgs(Object[] args, Class<?>[] methodParameterTypes) {
if(args.length == methodParameterTypes.length
&& args[args.length - 1].getClass().equals(methodParameterTypes[methodParameterTypes.length - 1])) {
return args;
}
Object[] newArgs = new Object[methodParameterTypes.length];
System.arraycopy(args, 0, newArgs, 0, methodParameterTypes.length - 1);
Class<?> varArgComponentType = methodParameterTypes[methodParameterTypes.length - 1].getComponentType();
int varArgLength = args.length - methodParameterTypes.length + 1;
Object[] varArgsArray = (Object[])Array.newInstance(varArgComponentType, varArgLength);
// System.out.println("varArgComponentType: " + varArgComponentType);
// System.out.println("varArgsArray: " + Arrays.asList(varArgsArray).toString());
// System.out.println("args: " + Arrays.asList(args).toString());
System.arraycopy(args, methodParameterTypes.length - 1, varArgsArray, 0, varArgLength);
newArgs[methodParameterTypes.length - 1] = varArgsArray;
return newArgs;
}
}