java - 使用 'Reflect' 从扩展抽象类获取参数值

标签 java class reflection casting

我想从扩展类中获取 param2 值,该扩展类具有与抽象类“B”共享的公共(public)属性,如下所示:

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; 是正确的,但在运行时我收到错误: Thread "main"java.lang.ClassCastException: java.lang 中的异常.reflect.Field 无法转换为 Fields$A$B0

为什么?

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

有办法吗?

谢谢

最佳答案

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

Formally the instruction B0 tmp_b0 = (B0) AnyB; is correct,

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

您不想传递 Field 本身 - 我怀疑您想传递与 a 相关的字段的 :

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

即使如此,您仍然会在 b1 字段中得到 ClassCastException,因为它的执行时类型为 B1,但您试图转换为 B0B1 的实例不是 B0 的实例。

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

(我还建议不要过多使用嵌套类,并遵循 Java 命名约定,但这些约定有些不同。)

关于java - 使用 'Reflect' 从扩展抽象类获取参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52733794/

相关文章:

java - 通过 JAVA DataOutputStream 发送 key

java - 为什么super可以访问父类(super class)的非静态变量?

Java 转换为整数?

c#:从对象 [] 数组调用存储对类对象的引用的通用方法

C++相互类依赖

java - 使用反射从抽象基类访问构造函数

Java swing 应用程序找不到图像

java - 使用 if/else 语句时“无法解析符号”

c# - base.Invoke 委托(delegate)

java - Java反射API中的反射方法是什么?