类方法 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. sqlserver操作命令

    启动命令:Net Start MSSqlServer 暂停命令:Net Pause MSSqlServer 重新启动暂停的命令:Net Continue MSSqlServer 停止命令:Net st ...

  2. 38. CentOS-6.3安装配置Tomcat-7

    安装说明 安装环境:CentOS-6.3安装方式:源码安装 软件:apache-tomcat-7.0.29.tar.gz下载地址:http://tomcat.apache.org/download-7 ...

  3. task 03-27

    To integrate  the spring with  jpa, Basically completed the jpa of study;To integrate  the spring wi ...

  4. leetcode83

    /** * Definition for singly-linked list. * public class ListNode { * public int val; * public ListNo ...

  5. HTML网页Table解析

    procedure TForm27.Button1Click(Sender: TObject); var doc2: IHTMLDocument2; doc3: IHTMLDocument3; ita ...

  6. Annoying “Remote System Explorer Operation” causing freeze for couple of seconds

    Eclipse -> Preferences -> General -> Startup and Shutdown. -Uncheck RSE UI. Eclipse -> P ...

  7. Haskell语言学习笔记(67)Gtk2Hs

    Gtk2Hs $ brew cask install xquartz $ brew install glib cairo gtk gettext fontconfig freetype $ expor ...

  8. dapper.net 转载

    Dapper.NET——轻量ORM   Dapper.NET使用 本文目录 Dapper.NET使用 1.为什么选择Dapper 2.以Dapper(4.0)为例. 2.1 在数据库中建立几张表. 2 ...

  9. 迷你MVVM框架 avalonjs 1.3.9发布

    本次升级,avalon改进了许多内部方法,大大提升性能,并且带来异步刷新视图的新功能. ms-html内部不再使用异步 head元素中的avalon元素加入ms-skip指令 重构计算属性,现在超级轻 ...

  10. 电脑连接树莓派Pi Zero W

    作者:陈拓 chentuo@ms.xab.ac.cn 2018.05.16/2018.06.09 0.  概述 本位介绍两种电脑连接树莓派Pi Zero W的方法: 电脑通过USB以太网连接树莓派Ze ...