>我需要从一个类中获取私有字段并将它们设置为另一个类。
此代码非常适合测试整数字段(写入 100500 个值):
//get objects, class firs...
for(int i =0; i<fields1.length; i++) {
Field field1 = fields1 [i];
Field field = fields [i];
field.setAccessible(true);
field.set(app, new Integer(100500));
}
当然,当我切换到未定义类型时(字段有不同的类型:日期、整数、字符串......
例如,类一有日期,类二有日期,我需要从另一个值复制一个值,但下一个字段将是两个类中的字符串)
for(int i =0; i<fields1.length; i++) {
Field field1 = fields1 [i];
Field field = fields [i];
field.setAccessible(true);
field.set(app, field1);
}
我收到一个非法参数异常,例如,我实际上无法从一个类中获取值并将其设置为另一个类。
亲爱的社区,请给我一个提示 - 我做错了什么?
对我来说,看起来您交出了字段引用而不是字段值:
for(int i =0; i<fields1.length; i++) {
Field field1 = fields1 [i];
Field field = fields [i];
field.setAccessible(true);
field.set(app, field1.get(app1)); //or whatever object field1 is from
}
虽然我不会那样做,因为秩序是脆弱的东西......你可以使用beanutils来复制你的豆子,如果是,你想要实现什么
这应该适合您的需求:
public static <T> void copyDeclaredFields(T from, T to) throws Exception {
Class<?> clazz = from.getClass();
if (!clazz.equals(to.getClass())) {
throw new IllegalArgumentException();
}
for (Field field : clazz.getDeclaredFields()) {
Object value = field.get(from);
field.set(to, value);
}
}
要调用:
Item item1 = new Item();
// item1.set...
Item item2 = new Item();
copyDeclaredFields(item1, item2);
您的错误似乎与您尝试将 Field1 设置为字段的参数而不是 Field1 的值有关。
field.set(app, field1);
应该改为
field.set(app, field1.get(app1));
看一个小的工作示例;
如果您更改
fieldDest.set(destination, fieldSrc.get(source));
自
fieldDest.set(destination, fieldSrc);
你会得到这个问题的相同错误。
希望有帮助。
示例代码:
import java.util.*;
import java.lang.*;
import java.lang.reflect.*;
class Main
{
public static void main (String[] args) throws java.lang.Exception
{
Source source = new Source();
Destination destination = new Destination();
Class sourceClassObject = source.getClass();
Class destClassObject = destination.getClass();
Field[] sourceFields = sourceClassObject.getDeclaredFields();
Field[] destFields = destClassObject.getDeclaredFields();
for (Field fieldSrc : sourceFields) {
int mod = fieldSrc.getModifiers(); // get modifiers
System.out.print("Source Field: " + Modifier.toString(mod) + " "
+ fieldSrc.getType() + " " + fieldSrc.getName());
fieldSrc.setAccessible(true);
System.out.println(" [" + fieldSrc.get(source) + "]");
for (Field fieldDest : destFields){
if (fieldDest.getType().equals(fieldSrc.getType()) &&
fieldDest.getName().equals(fieldSrc.getName())){
fieldDest.setAccessible(true);
fieldDest.set(destination, fieldSrc.get(source));
}
}
}
destination.printValues();
}
static class Source{
public Source(){
strField = "This is a String";
intField = 42;
dateField = new Date();
}
private String strField;
private Integer intField;
private Date dateField;
}
static class Destination{
private String strField;
private Integer intField;
private Date dateField;
public void printValues(){
System.out.println("Destination Field values: ");
System.out.println("strField: " + strField);
System.out.println("intField: " + intField);
System.out.println("dateField: " + dateField);
}
}
}