Java 如何在运行时通过反射获取文件类型?
如何在运行时通过反射获得测试方法中的类类型(A1或A2)?我尝试了Java 如何在运行时通过反射获取文件类型?,java,reflection,polymorphism,Java,Reflection,Polymorphism,如何在运行时通过反射获得测试方法中的类类型(A1或A2)?我尝试了this.getClass().getField(“base”).getType()但是getType返回声明的类型,有什么方法可以做到这一点吗 提前谢谢 public class Base{ } public class A1 extends Base{ } public class A2 extends Base{ } public abstract class Cmd{ public Base base;
this.getClass().getField(“base”).getType()
但是getType返回声明的类型,有什么方法可以做到这一点吗
提前谢谢
public class Base{
}
public class A1 extends Base{
}
public class A2 extends Base{
}
public abstract class Cmd{
public Base base;
public void test(){
this.getClass().getField("base").getType();
}
}
public class Cmd1 extends Cmd{
public Cmd1(Base base){
this.base = base;
}
}
public class Cmd2 extends Cmd{
public Cmd2(Base base){
this.base = base;
}
}
Base testBase = new A1();
Cmd myCmd = new Cmd1(testBase);
你想要的是完全不可能的
this.getClass()
将引用表示Cmd1
类或Cmd2
类的对象。然而,在任何一种情况下,名称base
所指的实际字段都是公共基代码>字段。该字段的类型为Base
,因为。。嗯,就在那里。它不会因为这个类是子类而神奇地改变。反射表示您键入的类,而不是它的任何特定实例
当您谈到Cmd1
或Cmd2
的特定实例时,由于存在此
引用,您可以取消对字段的引用并检查实际存在的内容:this.base.getClass()
。当然,如果this.base
为空,则不起作用,这就是问题所在:base字段可以引用类型为base
的任何实例或其任何子类型,但当前它不引用任何内容,因此,无法回答“您所引用的对象的具体类型是什么”的问题。为什么不改为执行base.getClass()
?类Cmd1
和Cmd2
的存在是一种误导。在需要Base
的情况下,通过A1
实例的决定在Base testBase=new A1()处作出;Cmd myCmd=new Cmd1(testBase)代码>位置,可以是应用程序中的任意位置。它还决定构造Cmd1
的实例,并将其分配给Cmd
类型的变量,但这是完全无关的。Cmd1
和A1
之间没有连接。代码可以改为new Cmd2(new A1())
或new Cmd1(new A2())
。我们甚至不能排除同一运行时中的其他一些代码已经这样做了。当然,这是一个骗局,但提问者似乎认为从基字段派生A1是可能的。@rzwitserroot是的,你的答案就是我想要的。非常感谢。