如何确定一个对象的类?

时间:2009-02-12 15:18:25

标签: java inheritance

如果课程B和课程C扩展了课程A并且我有BC类型的对象,我该如何确定哪种类型这是一个实例?

11 个答案:

答案 0 :(得分:746)

if (obj instanceof C) {
//your code
}

答案 1 :(得分:316)

使用Object.getClass()。它返回对象的运行时类型。

答案 2 :(得分:154)

提供了多个正确答案,但还有更多方法:Class.isAssignableFrom()并且只是试图转换对象(可能会抛出ClassCastException)。

概括的可能方式

让我们总结一下测试对象obj是否为C类型实例的可能方法:

// Method #1
if (obj instanceof C)
    ;

// Method #2
if (C.class.isInstance(obj))
    ;

// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
    ;

// Method #4
try {
    C c = (C) obj;
    // No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}

// Method #5
try {
    C c = C.class.cast(obj);
    // No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}

null处理

的差异

null处理方式有所不同:

  • 如果falseobjnull不是任何事件的实例),前两个方法中的表达式评估为null
  • 第三种方法显然会抛出NullPointerException
  • 相反,第4和第5种方法接受null因为null可以转换为任何类型!
  

要记住:null 不是任何类型的实例,但可以>投射到任何类型。

备注

  • Class.getName()不应该用于执行“is-instance-of”测试,因为如果对象不是C类型,而是它的子类,它可能有一个完全不同的名称和包(因此类名显然不匹配)但它仍然是C类型。
  • 对于相同的继承原因Class.isAssignableFrom()不是对称
    如果obj.getClass().isAssignableFrom(C.class)的类型是false的子类,obj将返回C

答案 3 :(得分:31)

您可以使用:

Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object

HTH。但我认为大多数情况下,将它用于控制流程或类似的东西是不好的做法......

答案 4 :(得分:24)

任何使用任何建议的方法都被视为代码气味,它基于糟糕的OO设计。

如果你的设计很好,你不应该发现自己需要使用getClass()instanceof

任何建议的方法都可以,但只需记住一些设计方法。

答案 5 :(得分:15)

在这种情况下我们可以使用反射

objectName.getClass().getName();

实施例: -

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String name = request.getClass().getName();
}

在这种情况下,您将获得对象传递给HttpServletRequest接口参考变量的类的名称。

答案 6 :(得分:13)

Class”类上还有一个.isInstance方法。如果您通过myBanana.getClass()获得了对象的课程,则可以通过

查看您的对象myApple是否是与myBanana相同的类的实例
myBanana.getClass().isInstance(myApple)

答案 7 :(得分:0)

如果想在运行时知道,仅用isinstance()进行

检查是不够的。 使用:

if(someObject.getClass().equals(C.class){
    // do something
}

答案 8 :(得分:0)

我在GeneralUtils类中使用了打击功能,请检查它是否有用

    public String getFieldType(Object o) {
    if (o == null) {
        return "Unable to identify the class name";
    }
    return o.getClass().getName();
}

答案 9 :(得分:0)

我使用Java 8泛型来获取运行时的对象实例,而不必使用切换用例

 public <T> void print(T data) {
    System.out.println(data.getClass().getName()+" => The data is " + data);
}

传递任何类型的数据,该方法将打印您在调用时传递的数据类型。例如

    String str = "Hello World";
    int number = 10;
    double decimal = 10.0;
    float f = 10F;
    long l = 10L;
    List list = new ArrayList();
    print(str);
    print(number);
    print(decimal);
    print(f);
    print(l);
    print(list);

以下是输出

java.lang.String => The data is Hello World
java.lang.Integer => The data is 10
java.lang.Double => The data is 10.0
java.lang.Float => The data is 10.0
java.lang.Long => The data is 10
java.util.ArrayList => The data is []

答案 10 :(得分:0)

您可以使用 getSimpleName()

假设我们有一个对象: Dog d = new Dog()

我们可以使用以下语句获取类名:Dog。例如:

d.getClass()。getSimpleName(); //返回字符串“ Dog”。

PS:d.getClass()将为您提供对象的全名。