为什么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)
行应该是真的。但对我来说,输出是假的。
任何人都可以解释一下吗?
答案 0 :(得分:3)
Class.class
是Class
的实例,而不是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)){