instanceof,isinstance,isAssignableFrom,asSubclass的区别
1,isAssignableFrom():是字节码对象的方法
是用来判断一个类的字节码对象和另一个类的字节码对象是否相同或是子类或接口。
assignable英 [ə,sainəbl]美 [ə,sainəbl] adj. [经] 可分配的;可指定的;可让渡的 更多释义>> [网络短语] assignable 可转让信用证,可转让的,可指定的 assignable assets 可确指的资产 assignable document 可转让单据
格式为:(xxx是否可从xxx转换)
Class1.isAssignableFrom(Class2)
调用者和参数都是java.lang.Class类型的对象。
/** * 判断一个类是否是另一个类的父类 * 是false */ public static void testIsAssignedFrom1() { System.out.println("String是Object的父类:"+String.class.isAssignableFrom(Object.class)); } /** * 判断一个类是否是另一个类的父类 * 是true */ public static void testIsAssignedFrom2() { System.out.println("Object是String的父类:"+Object.class.isAssignableFrom(String.class)); } /** * 判断一个类是否和另一个类相同 * 是true */ public static void testIsAssignedFrom3() { System.out.println("Object和Object相同:"+Object.class.isAssignableFrom(Object.class)); }
2,instanceof :是关键词
是用来判断一个对象实例是否是一个类或接口的或其子类子接口的实例。
如果被测对象是null值,则测试结果总是false。
格式是:
o instanceof TypeName
第一个参数是对象实例名,第二个参数是类名或接口名,例如:String/InputStream。
/** * 判断str是否是Object类的实例 * 是true */ public static void testInstanceOf1() { String str = new String(); System.out.print("str是Object的实例:"); System.out.println(str instanceof Object); } /** * 判断o是否是Object类的实例 * 是true */ public static void testInstanceOf2() { Object o = new Object(); System.out.print("o是Object的实例:"); System.out.println(o instanceof Object); }
3,isinstance:字节码对象的方法
这个方法是instanceof运算符的动态等价。 自身类.class.isInstance(自身实例或子类的实例) 返回true
例子:
String s=new String("javaisland"); System.out.println(String.class.isInstance(s)); //true
4,asSubclass:是字节码对象的方法
asSubclass用于窄化未知的Class类型的范围(得到一个特定类型字节码对象。)
是java.lang.Class中的一个方法,作用是将class对象(字节码对象)转换成由clazz参数所表示的class对象(字节码对象)的某个子类。
public <U> Class<? extends U> asSubclass(Class<U> clazz)
例子:
List<String> strList = new ArrayList<String>(); Class<? extends List> strList_cast = strList.getClass().asSubclass(List.class);
这么做似乎没有什么意义,因为我们很清楚strList.getClass()获取的class对象就是ArrayList,它当然是List.class的一个子类;
但有些情况下,我们并不能确知一个class对象的类型,典型的情况是Class.forName()获取的class对象:class.forName()的返回类型是Class<>,但这显然太宽泛了,
假设我们需要List.class类型的class对象,这时我们就可以用到asSubclass()这个方法了,如下:
Class.forName("xxx.xxx.xxx").asSubclass(List.class).newInstance();
当xxx.xxx.xxx是List的子类时,正常执行,当不是List的子类时,抛出ClassCastException。asSubclass()在JDK中广泛使用。