类方法 isAssignableFrom、instanceof 和 asSubclass
Spring 框架 CollectionFactory 的 asEnumType 方法使用 “类.asSubclass()”,代码如下:
private static Class<? extends Enum> asEnumType(Class<?> enumType) {
Assert.notNull(enumType, "Enum type must not be null");
if (!Enum.class.isAssignableFrom(enumType)) {
throw new IllegalArgumentException("Supplied type is not an enum: " + enumType.getName());
}
return enumType.asSubclass(Enum.class);
}
1. class1.isAssignableFrom(class2)
判断 class2 是不是 class1 的子类或者子接口
List.class.isAssignableFrom(ArrayList.class) // true
String.class.isAssignableFrom(ArrayList.class) // false
2. obj instanceof 类名
"string" instanceof String // true
3. asSubclass
public <U> Class<? extends U> asSubclass(Class<U> clazz) {
if (clazz.isAssignableFrom(this))
return (Class<? extends U>) this;
else
throw new ClassCastException(this.toString());
}
这是 java.lang.Class 中的一个方法,作用是将调用这个方法的 class 对象转换成由 clazz 参数所表示的 class 对象的某个子类。举例来说
List<String> strList = new ArrayList<String>();
Class<? extends List> strList_cast = strList.getClass().asSubclass(List.class);
上面的代码将 strList.getClass() 获取的 class 对象转换成 Class
Class.forName("xxx.xxx.xxx").asSubclass(List.class).newInstance();
当 xxx.xxx.xxx 是 List 的子类时,正常执行,当不是 List 的子类时,抛出 ClassCastException,这时我们可以做些别的处理;如果我们查看 Class.asSubclass() 在 JDK 中的中的引用的话,会发现这种用法有很多。asSubclass 用于窄化未知的 Class 类型的范围
参考: