首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反射IllegalArgumentException

反射IllegalArgumentException
EN

Stack Overflow用户
提问于 2013-02-04 18:49:28
回答 3查看 1.1K关注 0票数 3

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

这段代码非常适合测试Integer字段(写入100500值):

代码语言:javascript
复制
//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));       
}

然而,当我切换到未定义的类型时(字段有不同的类型:日期、整数、字符串...

例如,第一个类有日期,第二个类有日期,我需要从另一个值中复制一个值,但下一个字段在两个类中都将是字符串。)

代码语言:javascript
复制
for(int i =0; i<fields1.length; i++) {
    Field field1 = fields1 [i];
    Field field = fields [i];
    field.setAccessible(true);
    field.set(app,  field1);        
}

我收到一个IllegalArgumentException,例如我不能从一个类中获取值并将其设置到另一个类中。

请,亲爱的社区,给我一个提示-我做错了什么?

EN

回答 3

Stack Overflow用户

发布于 2013-02-04 18:59:30

对我来说,它看起来像是你交出了字段引用而不是字段值:

代码语言:javascript
复制
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,这是您想要实现的目标

票数 2
EN

Stack Overflow用户

发布于 2013-02-04 19:01:04

这应该能满足您的需求:

代码语言:javascript
复制
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);
    }
}

要呼叫:

代码语言:javascript
复制
Item item1 = new Item();
// item1.set...
Item item2 = new Item();
copyDeclaredFields(item1, item2);
票数 2
EN

Stack Overflow用户

发布于 2013-02-04 20:56:53

您的错误似乎与您试图将Field1设置为字段的参数,而不是Field1的值有关。

代码语言:javascript
复制
field.set(app,  field1);  

应该改为

代码语言:javascript
复制
field.set(app,  field1.get(app1));

看看a small working example

如果你改变了

代码语言:javascript
复制
fieldDest.set(destination, fieldSrc.get(source));

代码语言:javascript
复制
fieldDest.set(destination, fieldSrc);

您将得到与此问题相同的错误。

希望这能有所帮助。

示例代码:

代码语言:javascript
复制
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);
        }
    }    
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14685105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档