Java中检查持有对象的引用的类名

6
class A {
}

class B extends A {
}

class TestType {
   public static void main(String args[]) {
      A a = new B();
      // I wish to use reference 'a' to check the Reference-Type which is 'A'.
   }
}

这可行吗?如果不行,请说明原因。

7
无法实现。本地变量的静态类型在字节码中和运行时均不会被保留。(如果是字段,您可以使用反射在包含该字段的类上获取字段的类型。) - C. K. Young
1
@ChrisJester-Young 你应该把那个变成一个答案,而不是一条评论。 - Jesper
3个回答

3

2

检查Java中持有对象的引用的类名

你无法做到。

  1. 不存在“持有对象的唯一引用”。可能没有这样的引用,也可能有数不清的引用。

  2. 你无法从被持有的对象内部获取它们。


1
如果您调用 a.getClass(),它将始终返回创建此对象的类的实例。在您的情况下,它是 B,因此它将返回 B.class
现在,如果您想调用 a 上的方法并获取类作为 A.class,则无法以正常方式完成。
一个解决方法是在 A 中定义方法。
public static Class<A> getType() {
        return A.class;
    }

然后您可以调用 a.getType(),它是 A.class。我们在这里使用静态方法,因为它们没有被覆盖。


但是这种方法需要在每个类中添加以保持一致性,因此当调用getType时,该方法将被调用以获取B类的类型。 - Ankur
更新了答案以利用静态方法。 - Amit Deshpande
是的,解决方案有效。 :) 这是非常优雅和简单的解决方案。 - Amber
静态方法不会被覆盖,因此使用该方法没有问题。 - Amber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接