如何在Java中获取运行时声明的变量类型?

时间:2013-11-05 21:17:35

标签: java class object reflection runtime

考虑这段代码

class Parent {

}

class Child extends Parent {

}

public class InheritenceExample {

    public static void main(String[] args){
        Parent p1 = new Child();
        System.out.println("the class name is "+ p1.getClass().getName());

    }

}

我声明p1属于type Parent,但是将其分配给Child instance。当我getClass().getName()时,我得到Child作为输出。在这种情况下,如何获得Parent的声明类型?

编辑:这并非在所有情况下都有效:getClass().getSuperclass().getName()

考虑这段代码

class Parent {

}

class Child extends Parent {

}

class GrandChild extends Child {


}

public class InheritenceExample {

    public static void main(String[] args){
        Parent p1 = new GrandChild();
        System.out.println("the class name is "+ p1.getClass().getSuperclass().getName());

    }

}

此输出Child但必须为Parent

4 个答案:

答案 0 :(得分:0)

也许尝试使用getClass().getSuperclass()

答案 1 :(得分:0)

我认为没有其他方法可以找到而不仅仅是循环超类。

Class<?> c = p1.getClass();

while (c.getSuperclass() != Object.class) {
  c = c.getSuperclass();
}

System.out.println("the class name is "+ c.getClass());

答案 2 :(得分:0)

   getClass().getSuperclass().getName()

但是从来没有这样做,这是非常糟糕的设计

编辑:

在扩展版中,您需要一个循环

Parent superClass = p1.getClass();
while (superClass.getSuperclass() != Object.class) {
    superClass = superClass.getSuperclass();
}
superClass.getName();

答案 3 :(得分:-1)

获取直接超类

p1.getClass().getSuperClass();

但是,如果您要声明界面,则可以使用

        Class[] interfaces = p1.getInterfaces();
        if(interfaces != null){
            for(Class i : interfaces){
                System.out.println(i);
            }
        }