С помощью следующего кода я получаю только недопустимые исключения ARGUMENT - исключений недопустимого доступа:
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
public class Asdf2 {
private Long long1;
Long long2;
protected Long long3;
private long long4;
Long long5;
protected long long6;
protected void setData(Map<String, String[]> data) {
Class thisClass = this.getClass();
for (Map.Entry<String, String[]> item : data.entrySet()) {
try {
Field field = thisClass.getDeclaredField(item.getKey());
try {
field.setAccessible(true);
if (field.getType().getName().equals("java.lang.Long")) {
field.setLong(this, Long.valueOf(item.getValue()[0]));
} else {
field.set(this, item.getValue()); // EXCEPTION HERE!!!
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
} catch (NoSuchFieldException e) {
// Skip this field...
continue;
}
}
}
@Override
public String toString() {
return "Asdf2["
+ "long1=" + long1
+ ",long2=" + long2
+ ",long3=" + long3
+ ",long4=" + long4
+ ",long5=" + long5
+ ",long6=" + long6
+ "]";
}
public static void main(String[] args) {
Map<String, String[]> data = new HashMap<String, String[]>();
data.put("long1", new String[] { "1" });
data.put("long2", new String[] { "2" });
data.put("long3", new String[] { "3" });
data.put("long4", new String[] { "4" });
data.put("long5", new String[] { "5" });
data.put("long6", new String[] { "6" });
Asdf2 test = new Asdf2();
test.setData(data);
System.out.println(test);
System.out.println("Done!");
}
}
Мои комментарии:
1) Если это Long, вы помещаете первый элемент значения (который является массивом) в это поле, но в противном случае вы помещаете весь массив - это будет работать, только если поля также являются строковыми массивами
2) Вы не опубликовали полученное вами исключение. Это может дать более подробную информацию?
3) Вам нужно дать нам класс "this", а не просто метод set, нам нужно как минимум увидеть определения полей.