类方法 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. python的动态性和_slot_

    python是动态语言 1. 动态语言的定义 动态编程语言 是 高级程序设计语言 的一个类别,在计算机科学领域已被广泛应用.它是一类 在运行时可以改变其结构的语言 :例如新的函数.对象.甚至代码可以被 ...

  2. 查windows系统开关机记录

    https://blog.csdn.net/dufufd/article/details/53316079 者是按下"开始菜单"-"程序"-"管理工具 ...

  3. [python爬虫] Selenium定向爬取PubMed生物医学摘要信息

    本文主要是自己的在线代码笔记.在生物医学本体Ontology构建过程中,我使用Selenium定向爬取生物医学PubMed数据库的内容.        PubMed是一个免费的搜寻引擎,提供生物医学方 ...

  4. HTML5 Canvas ( 文字横纵对齐 ) textAlign, textBaseLine

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. is not on any development teams

    is not on any development teams 1)账号正在申请中 2)申请成功后的账号? 加了3个账号,都是这样子的. 1:Xcode>Window> "Org ...

  6. VB6 创建控制台应用程序

    ' 功能:为VB程序创建一个consolewindow.Private Declare Function AllocConsole Lib "kernel32" () As Lon ...

  7. apiCloud事件发送与监听

    apiCloud事件发送与监听 1.sendEvent 将任意一个自定义事件广播出去,该事件可在任意页面通过 addEventListener 监听收到. sendEvent({params}) 2. ...

  8. margin和padding的四种写法

    我们经常会看到CSS样式属性中外边距margin和内边距padding的各种用法,这里做一个小结,但只简单介绍margin,因为它们的用法大同小异. 方法一. margin:10px; //4个外边距 ...

  9. STS或eclipse安装SVN插件

    安装sts--SVN插件 简介:sts是与eclipse类似的Java IDE开发工具(不了解的百度) 1.sts菜单栏 help->install New Software 依据大家的版本选择 ...

  10. ComputeSignature 中行支付签名报错(win7 64位系统)

    在做中行加密验签的时候出现的问题.原本在XP系统下可以正常运行的,现在换了win7 64位系统就出现了这个问题,没头绪 所以发上来求各位大大支招 有什么好的解决方案.. 我的解决办法: 1.C:\Do ...