IllegalArgumentException при попытке получить ссылку на поле с помощью отражения - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь перебрать множество ArrayLists пользовательских классов с одним и тем же кодом, и подумал, что с помощью отражения это будет проще.Я сталкиваюсь с проблемой, когда пытаюсь получить ссылку на каждое поле.Вот небольшое представление кода, который я пытаюсь запустить.(мой код отличается, но основы есть):

    import java.lang.reflect.*;
    import java.util.ArrayList;


    public class Stack {

        public ArrayList<Custom1> cust11;
        public ArrayList<Custom1> cust12;
        public ArrayList<Custom1> cust13;
        public ArrayList<Custom2> cust21;
        public ArrayList<Custom2> cust22;
        public ArrayList<Custom2> cust23;
        public static void main(String args[]) {
            Stack stack = new Stack();
        }

        public Stack() {
            cust11 = new ArrayList<Custom1>();
            cust12 = new ArrayList<Custom1>();
            cust13 = new ArrayList<Custom1>();
            cust21 = new ArrayList<Custom2>();
            cust22 = new ArrayList<Custom2>();
            cust23 = new ArrayList<Custom2>();

            doReflect();
        }

        public void doReflect(){
            Field[] fields = this.getClass().getFields();
            for(Field f : fields) {
                if(f.getName().contains("cust1")) {
                    try {
                        ArrayList<Custom1> temp = (ArrayList<Custom1>)f.get(cust11);

                    } catch (IllegalArgumentException | IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    class Custom1{
        public Custom1() {}
    }

    class Custom2{
        public Custom2() {}
    }

Когда он достигает

ArrayList<Custom1> temp = (ArrayList<Custom1>)f.get(cust11);

Я получаю

java.lang.IllegalArgumentException: Can not set java.util.ArrayList field 
Stack.cust11 to java.util.ArrayList
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(Unknown Source)
at sun.reflect.UnsafeObjectFieldAccessorImpl.get(Unknown Source)
at java.lang.reflect.Field.get(Unknown Source)
at Stack.doReflect(Stack.java:33)
at Stack.<init>(Stack.java:25)
at Stack.main(Stack.java:14)

Как я могу это сделать

1 Ответ

0 голосов
/ 25 октября 2018

Я должен был использовать

ArrayList<Custom1> temp = (ArrayList<Custom1>)f.get(this);
...