我想从扩展类中获取 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
。
为什么?
有一种方法可以获取参数param1
或param2
的值。
有办法吗?
谢谢
最佳答案
(注意:这个答案是在问题完全改变之前写的。我现在就这样保留它,希望问题能被回滚。)
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
,但您试图转换为 B0
。 B1
的实例不是 B0
的实例。
不太清楚你想在这里实现什么 - 为什么你有一个 B0
类,当你从不创建它的实例时 - 但我建议尝试让事情正常工作首先没有反射,然后当您使用反射时,区分字段的概念(由Field
表示)和值一个字段。
(我还建议不要过多使用嵌套类,并遵循 Java 命名约定,但这些约定有些不同。)
关于java - 使用 'Reflect' 从扩展抽象类获取参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52733794/