首页 文章

如何确定一个对象的类?

提问于
浏览
448

如果类 B 和类 C 扩展类 A 并且我有一个类型为 BC 的对象,我如何确定它是一个实例的类型?

7 回答

  • 298
    if (obj instanceof C) {
    //your code
    }
    
  • 723

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

  • 146

    Class ”类上还有一个.isInstance方法 . 如果你通过 myBanana.getClass() 得到一个对象的类,你可以看到你的对象 myApple 是否是与 myBanana 相同的类的实例

    myBanana.getClass().isInstance(myApple)
    
  • 15

    您可以使用:

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

    HTH . 但我认为大多数情况下,将其用于控制流程或类似的事情并不是一个好的做法......

  • 25

    任何建议的方法的任何使用都被认为是基于不良OO设计的代码气味 .

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

    任何建议的方法都可以,但只需要记住,设计方面 .

  • 13

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

    objectName.getClass().getName();
    

    例:-

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        String name = request.getClass().getName();
    }
    

    在这种情况下,您将获得对象传递给 HttpServletRequest interface refference变量的类的名称 .

  • 30

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

    总结可能的方式

    让我们总结一下测试对象 objC 类型实例的可能方法:

    // 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 处理有区别但是:

    • 在前两个方法中,如果 objnullnull 不是任何实例),则表达式求值为 false .

    • 第三种方法显然会抛出 NullPointerException .

    • 相反,第4和第5种方法接受 null ,因为 null 可以转换为任何类型!

    要记住:null不是任何类型的实例,但可以转换为任何类型 .

    注意事项

    • Class.getName() 不应该用于执行"is-instance-of"测试,因为如果对象不是 C 类型但是它的子类,它可能有一个完全不同的名称和包(因此类名显然不匹配)但它仍然是类型 C .

    • 对于相同的继承原因 Class.isAssignableFrom() 不对称:
      如果 obj 的类型是 C 的子类, obj.getClass().isAssignableFrom(C.class) 将返回 false .

相关问题