【问题标题】:Get parameter value from extended abstract class using 'Reflect'使用“反射”从扩展抽象类中获取参数值
【发布时间】:2019-03-14 23:39:17
【问题描述】:

我想从一个扩展类中获取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

为什么?

有一种方法可以获取参数param1param2的值。

有办法吗?

谢谢

【问题讨论】:

  • 对于新版本的问题,我仍然强烈建议您开始遵循 Java 命名约定,并避免嵌套类,除非您确实需要它们。

标签: java class reflection casting


【解决方案1】:

(注意:这个答案是在问题完全改变之前写的。我现在就这样离开,希望问题能被回滚。)

正式的指令B0 tmp_b0 = (B0) AnyB;是正确的,

嗯,它是有效的 Java 代码,但我不希望它在这种情况下工作。您当前正在传递 Field 引用 - 这 不是 B0,因此您遇到了异常。

您不想传递 Field 本身 - 我怀疑您想传递相对于 a 的字段的

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

即便如此,您仍然会为 b1 字段获得一个 ClassCastException,因为它的执行时间类型为 B1,但您正在尝试转换为B0B1 的实例不是B0 的实例。

目前还不是很清楚你想在这里实现什么 - 为什么你有一个 B0 类,而你从来没有创建它的实例 - 但我建议尝试让事情工作没有 首先进行反射,然后当您确实使用反射时,请区分字段的概念(由 Field 表示)和字段的值。

(我还建议不要尽可能多地使用嵌套类,并遵循 Java 命名约定,但它们在某种程度上是分开的。)

【讨论】:

  • 我只是把上面问题的内容改了。谢谢
  • @user2552555:这有点无益,因为它现在让我的答案看起来完全无效。我建议您将问题回滚到上一个版本,并提出一个看起来像这样的新问题 - 因为它会有一个完全不同的答案。
  • 好的,我按照您的建议执行了回滚。抱歉出错!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多