类方法 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<? extends List>,这么做似乎没有什么意义,因为我们很清楚 strList.getClass() 获取的class对象就是 ArrayList,它当然是 List.class 的一个子类;但有些情况下,我们并不能确知一个 class 对象的类型,典型的情况是 Class.forName() 获取的 class 对象:class.forName()的返回类型是 Class<>,但这显然太宽泛了,假设我们需要 List.class 类型的 class 对象,但我们传递给 Class.forName 的参数是未知的(可能是 "java.lang.String",也可能是 "java.util.ArrayList"),这时我们就可以用到 asSubclass() 这个方法了,如下:

Class.forName("xxx.xxx.xxx").asSubclass(List.class).newInstance();

当 xxx.xxx.xxx 是 List 的子类时,正常执行,当不是 List 的子类时,抛出 ClassCastException,这时我们可以做些别的处理;如果我们查看 Class.asSubclass() 在 JDK 中的中的引用的话,会发现这种用法有很多。asSubclass 用于窄化未知的 Class 类型的范围

参考:

http://blog.csdn.net/csywwx2008/article/details/17641405

类方法 isAssignableFrom、instanceof 和 asSubclass的更多相关文章

  1. java isAssignableFrom instanceof 小结 专题

    一句话总结: isAssignableFrom()方法是从类继承的角度去判断,instanceof()方法是从实例继承的角度去判断. public native boolean isAssignabl ...

  2. Java【第七篇】面向对象之类设计

    Java类的继承 类继承语法规则 < 修饰符> class < 子类名称> [extends < 父类>] { <属性和方法的声明> }  类的继承 子 ...

  3. Java推断类和实例的关系

       通常我们使用instanceOf关键字来推断一个对象是否是类的实例,近期博主看到isInstance关键字,不解与instanceOf的差别,故度娘了一下,顺便涨了一下姿势.    Java中推 ...

  4. instanceof,isinstance,isAssignableFrom,asSubclass的区别

    1,isAssignableFrom():是字节码对象的方法 是用来判断一个类的字节码对象和另一个类的字节码对象是否相同或是子类或接口. assignable英 [ə,sainəbl]美 [ə,sai ...

  5. instanceof, isinstance,isAssignableFrom的区别

    instanceof运算符 只被用于对象引用变量,检查左边的被测试对象 是不是 右边类或接口的 实例化.如果被测对象是null值,则测试结果总是false. 形象地:自身实例或子类实例 instanc ...

  6. instanceof 与isAssignableFrom

    instanceof 针对实例 isAssignableFrom针对class对象 isAssignableFrom   是用来判断一个类Class1和另一个类Class2是否相同或是另一个类的超类或 ...

  7. Class.isAssignableFrom(Class clz)与instanceof与Class.isInstance(Object obj) 的区别和联系

    编程的时候可能会遇到一个不知道它属于哪个类的对象,我们可以用下列运算符或者方法来判断.  1.instanceof instanceof是运算符只被用于对象引用变量,检查左边的被测试对象是不是右边类或 ...

  8. instanceof、 isinstance 与 isAssignableFrom的区别

    instanceof运算符 只被用于对象引用变量,检查左边的被测试对象 是不是 右边类或接口的 实例化.如果被测对象是null值,则测试结果总是false. 形象地:自身实例或子类实例 instanc ...

  9. isAssignableFrom与instanceof的区别

    1.isAssignableFrom针对的是class对象: 2.instanceof是实例. isAssignableFrom是用来判断一个类Class1和另一个类Class2是否相同或是另一个类的 ...

随机推荐

  1. CUDA C Programming Guide 在线教程学习笔记 Part 8

    ▶ 线程束表决函数(Warp Vote Functions) ● 用于同一线程束内各线程通信和计算规约指标. // device_functions.h,cc < 9.0 __DEVICE_FU ...

  2. Amazon AWS S3 操作手册

    Install the SDK The recommended way to use the AWS SDK for Java in your project is to consume it fro ...

  3. JAVA Spring JdbcTemplate ( 以 SQLSERVER 为例 ) 的简单使用

    < 1 > 配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&q ...

  4. eclipse中build path与Web Deployment Assembly的作用,区别

    转自:https://blog.csdn.net/heart_mine/article/details/79402792 以下内容只为做个笔记记录已下,有问题可以留言,欢迎补充. 今天在eclipse ...

  5. DataTable转换成实体

    public static class DataTableToEntity { /// <summary> /// 将DataTable数据源转换成实体类 /// </summary ...

  6. linux配置裸设备

    1.什么裸设备?字符设备?块设备? 裸设备:也叫裸分区(原始分区),是一种没有经过格式化,不被Unix/Linux通过文件系统来读取的特殊字符设备.它由应用程序负责对它进行读写操作.不经过文件系统的缓 ...

  7. Java操作Excel之Poi

    package com.java1234.poi; import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSF ...

  8. Haskell语言学习笔记(63)Dicidable

    Dicidable class Divisible f => Decidable f where lose :: (a -> Void) -> f a choose :: (a -& ...

  9. MySQL高级-索引

    1.索引是什么 索引(Index)是帮助MySQL高效获取数据的数据结构.可以得到索引的本质:索引是数据结构. 可以理解为“排好序的快速查找数据结构” 在数据之外,数据库系统还维护着满足特定查找算法的 ...

  10. sdc docker连接

    curl -O https://raw.githubusercontent.com/joyent/sdc-docker/master/tools/sdc-docker-setup.sh &&a ...