Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在运行时通过反射获取文件类型?_Java_Reflection_Polymorphism - Fatal编程技术网

Java 如何在运行时通过反射获取文件类型?

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;

如何在运行时通过反射获得测试方法中的类类型(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;
    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是的,你的答案就是我想要的。非常感谢。