parseArgs(args, 0, attrs);
Class userClass = userData.getClass();
while (userClass != null) {
for (final Field field : userClass.getDeclaredFields()) {
Arg ann = field.getAnnotation(Arg.class);
if (ann != null) {
String argDest = ann.dest();
if (argDest.isEmpty()) {
argDest = field.getName();
}
if (!attrs.containsKey(argDest)) {
continue;
}
Object val = attrs.get(argDest);
try {
AccessController
.doPrivileged(new PrivilegedAction<Void>() {
@Override
public Void run() {
field.setAccessible(true);
return null;
}
});
field.set(userData,
ReflectHelper.list2Array(field.getType(), val));
} catch (RuntimeException e) {
if (!ann.ignoreError()) {
throw e;
}
} catch (Exception e) {
if (!ann.ignoreError()) {
throw new IllegalArgumentException(String.format(
TextHelper.LOCALE_ROOT,
"Could not set %s to field %s", val,
field.getName()), e);
}
}
}
}
for (final Method method : userClass.getDeclaredMethods()) {
Arg ann = method.getAnnotation(Arg.class);
if (ann != null) {
String argDest = ann.dest();
if (argDest.isEmpty()) {
argDest = method.getName();
}
if (!attrs.containsKey(argDest)) {
continue;
}
Object val = attrs.get(argDest);
Class<?>[] fargs = method.getParameterTypes();
if (fargs.length != 1) {
throw new IllegalArgumentException(String.format(
TextHelper.LOCALE_ROOT,
"Method %s must have one formal parameter",
method.getName()));
}
try {
AccessController
.doPrivileged(new PrivilegedAction<Void>() {
@Override
public Void run() {
method.setAccessible(true);
return null;
}
});
method.invoke(userData,
ReflectHelper.list2Array(fargs[0], val));
} catch (RuntimeException e) {
if (!ann.ignoreError()) {
throw e;
}
} catch (Exception e) {
if (!ann.ignoreError()) {
throw new IllegalArgumentException(String.format(
TextHelper.LOCALE_ROOT,
"Could not call method %s with %s",
method.getName(), val), e);
}