为什么ReflectionChild.class.isInstance(Class.class)不正确?

时间:2015-02-12 18:23:17

标签: java class

为什么ReflectionChild.class.isInstance(Class.class)不正确?

正如我们在反射中所知,Class.class.isInstance(Class.class)是真的。现在看下面的代码片段。

   ReflectionChild ch = new ReflectionChild(); //Take random class

    if(ch.getClass()==ReflectionChild.class){
        System.out.println("ch.getClass()==ReflectionChild.class");
    }

    System.out.println(ReflectionChild.class.getClass());
    System.out.println(Class.class);

    if(ReflectionChild.class.getClass()==Class.class){
        System.out.println("ReflectionChild.class.getClass()==Class.class");
        //System.exit(0);
    }
    if(ReflectionChild.class.isInstance(Class.class)){
        System.out.println("true");
        //System.exit(0);
    }else{
       System.out.println("false");
    }

输出结果为: -

ch.getClass()==ReflectionChild.class  // 1st SYSOUT

class java.lang.Class                 // 2nd SYSOUT

class java.lang.Class                 // 3rd SYSOUT  

ReflectionChild.class.getClass()==Class.class  //4th SYSOUT

false   // 5th SYSOUT

根据上述四个SYSOUT,ReflectionChild.class.isInstance(Class.class)行应该是真的。但对我来说,输出是假的。

任何人都可以解释一下吗?

3 个答案:

答案 0 :(得分:3)

Class.classClass的实例,而不是ReflectionChild 因此,isInstance()返回false。

答案 1 :(得分:2)

因为Class实例不是ReflectionChild类型的实例。

来自javadoc

  

具体来说,如果此Class对象表示声明的类,则为此   如果指定的true参数是实例,则method返回Object   表示的类(或其任何子类);它返回false   否则。

您提供的参数类型为Class,它不是由类文字表达式{{1}返回的ReflectionChild实例所代表的类型Class的实例}}

答案 2 :(得分:0)

来自Class#isInstance(Object)的Javadoc:

  

确定指定的Object是否与此Class所代表的对象分配兼容。此方法是Java语言instanceof运算符的动态等效项。如果指定的Object参数为非null,则该方法返回true,并且可以强制转换为此Class对象表示的引用类型,而不会引发ClassCastException。否则返回false。

因此,作为参数传递给方法的对象必须是由调用该方法的对象表示的类的实例,不是相反的 :应返回true的表达式如下:

if(Class.class.isInstance(ReflectionChild.class)){