Java中RTTI部分判断对象是不是某个特定类型的实例的方式包括instanceof、isInstance与isAssignableFrom。
查看JDK API文档可知:
instanceof是一个二元操作符:
boolean result = object instanceof class
判定object 是不是class或其子类的实例对象。
isInstance(Object obj) 是动态的instanceof:
判定指定的 Object 是否与此 Class 所表示的对象赋值兼容,返回一个boolean值。
isAssignableFrom(Class<?> cls)
判定此 Class 对象所表示的类或接口与指定的 Class 参数所表示的类或接口是否相同,或是否是其超类或超接口。
class A{}
class AA extends A{}
public class Test{
static void print(Boolean b){
System.out.println(b);
}
public static void main(String[] args){
A a= new A();
AA aa=new AA();
print(a instanceof A);
print(a instanceof AA);
print(aa instanceof A);
print(aa instanceof AA);
System.out.println();
print(A.class.isInstance(a));
print(A.class.isInstance(aa));
print(AA.class.isInstance(a));
print(AA.class.isInstance(aa));
System.out.println();
print(A.class.isAssignableFrom(A.class));
print(A.class.isAssignableFrom(AA.class));
print(AA.class.isAssignableFrom(A.class));
print(A.class.isAssignableFrom(AA.class));
}
}
输出:
instanceof:
true
false
true
true
isInstance:
true
true
false
true
isAssignableFrom:
true
true
false
true
总结
object instanceof class:判定object 对象是否属于class类或其子类,这里class是类名;
Class.isInstance(Object obj):与instanceof等价,判定object 对象是否属于Class类或其子类,这里Class不是类名,是Class对象的引用(如:A.class);
Class.isAssignableFrom(Class<?> cls):判定Class cls(参数)是否是Class类(左)或其子类,这里均为Class对象的引用。