Получить значение параметра из расширенного абстрактного класса, используя 'Reflect' - PullRequest
0 голосов
/ 10 октября 2018

Я хотел бы получить значение param2 из расширенного класса, который имеет общие свойства, общие с абстрактным классом 'B', например:

import java.lang.reflect.Field;

public class Fields {

    public class A{

        public abstract class B{
            int param1;
            String param2;
            public abstract void B ();
        }

        public class B0 extends B{
            @Override
            public void B() {
                this.param1 = 0;
                this.param2 = "Mario";
            }                                    
        }

        public class B1 extends B{
            @Override
            public void B() {
                this.param1 = 1;
                this.param2 = "Anna";
            }            
        }        

        B1 b1 = new B1();        

        public A (){
            b1.B();
        }

        public B0 GetB(Object AnyB){
            B0 tmp_b0 = (B0) AnyB;
            return tmp_b0;
        }
    }

    public Fields(){
        A a = new A();
        Field[] f = a.getClass().getDeclaredFields();

        for (int i = 0; i<f.length; i++){
            f[i].setAccessible(true);
            Object obj = f[i];
            String p2;
            p2 = a.GetB(obj).param2;
            System.out.println(p2);
        }        
    }

    public static void main(String [] args){
        Fields f = new Fields();        
    }
}

Формально инструкция B0 tmp_b0 = (B0) AnyB; верна, ново время выполнения я получаю сообщение об ошибке: Exception in thread "main" java.lang.ClassCastException: java.lang.reflect.Field cannot be cast to Fields$A$B0.

Почему?

Есть способ получить значение параметра param1 или param2.

Тамэто способ?

Спасибо

1 Ответ

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

(Примечание: этот ответ был написан до того, как вопрос был полностью изменен. Сейчас я оставляю его таким, как есть, в надежде, что вопрос будет отменен.)

Формально инструкцияB0 tmp_b0 = (B0) AnyB; правильно,

Хорошо, это допустимый код Java, но я не ожидаю, что он будет работать в этом случае.В настоящее время вы передаете ссылку Field - это , а не a B0, поэтому вы получаете исключение.

Вы не хотите передавать сам Field- Я подозреваю, что вы хотите передать значение поля относительно a:

Object fieldValue = f[i].get(a);
String p2 = a.GetB(fieldValue);

Даже тогда вы все же получите ClassCastException для поля b1, потому что оно имеет тип времени выполнения B1, но вы пытаетесь привести к B0.Экземпляр B1 это , а не экземпляр B0.

Не очень понятно, чего вы здесь добиваетесь - почему у вас вообще есть класс B0когда вы никогда не создаете его экземпляр - но я бы предложил сначала попытаться заставить все работать без отражения, а затем, когда вы do используете отражение, проведите различие между концепцией поля(как представлено Field) и значением поля.

(Я бы также предложил не столько использовать вложенные классы, а следовать соглашениям об именах Java, но они несколько различны.)

...