反射非法论证例外



>我需要从一个类中获取私有字段并将它们设置为另一个类。

此代码非常适合测试整数字段(写入 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);
        }
    }    
}

相关内容

  • 没有找到相关文章

最新更新