我需要从一个类中获取私有字段,并将它们设置为另一个类。
这段代码非常适合测试Integer字段(写入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);
}我收到一个IllegalArgumentException,例如我不能从一个类中获取值并将其设置到另一个类中。
请,亲爱的社区,给我一个提示-我做错了什么?
发布于 2013-02-04 18:59:30
对我来说,它看起来像是你交出了字段引用而不是字段值:
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来复制您的bean,这是您想要实现的目标
发布于 2013-02-04 19:01:04
这应该能满足您的需求:
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);发布于 2013-02-04 20:56:53
您的错误似乎与您试图将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);
}
}
}https://stackoverflow.com/questions/14685105
复制相似问题