一句话总结:

isAssignableFrom()方法是从类继承的角度去判断。当前类及子类都返回true。父类及接口返回false
instanceof方法是从实例继承的角度去判断。一个类的实例 是否实现某个接口,是不是实例对应类、实例对应类的父类
instanceof和isInstance 起的效果相同。
数组与上面的效果相同

基础数据:

    @Data
public static class ParentClass implements Serializable {
private String name;
} @Data
@EqualsAndHashCode(callSuper = true)
public static class OneLevelChildClass extends ParentClass {
private String oneLevelChildName;
} @Data
@EqualsAndHashCode(callSuper = true)
public static class TwoLevelChildClass extends OneLevelChildClass {
private String twoLevelChildName;
}

instanceof运算符 只被用于对象引用变量,检查左边的被测试对象 是不是 右边类或接口的 实例化。
如果被测对象是null值,则测试结果总是false。
形象地:自身实例子类实例 instanceof 自身类 返回true
例:
String s=new String("javaisland");
System.out.println(s instanceof String); //true

    @Test
public void testInstanceof() {
/**
* instanceof运算符 只被用于对象引用变量,检查左边的被测试对象 是不是 右边类或接口的 实例化。
* 如果被测对象是null值,则测试结果总是false。
*/
ParentClass parentClass = new ParentClass();
assertThat(parentClass instanceof Serializable).isEqualTo(true);
assertThat(parentClass instanceof ParentClass).isEqualTo(true);
assertThat(parentClass instanceof OneLevelChildClass).isEqualTo(false);
assertThat(parentClass instanceof TwoLevelChildClass).isEqualTo(false); OneLevelChildClass oneLevelChildClass = new OneLevelChildClass();
assertThat(oneLevelChildClass instanceof Serializable).isEqualTo(true);
assertThat(oneLevelChildClass instanceof ParentClass).isEqualTo(true);
assertThat(oneLevelChildClass instanceof OneLevelChildClass).isEqualTo(true);
assertThat(oneLevelChildClass instanceof TwoLevelChildClass).isEqualTo(false); TwoLevelChildClass twoLevelChildClass = new TwoLevelChildClass();
assertThat(twoLevelChildClass instanceof Serializable).isEqualTo(true);
assertThat(twoLevelChildClass instanceof ParentClass).isEqualTo(true);
assertThat(twoLevelChildClass instanceof OneLevelChildClass).isEqualTo(true);
assertThat(twoLevelChildClass instanceof TwoLevelChildClass).isEqualTo(true);
}

Class类的isInstance(Object obj)方法,obj是被测试的对象,如果obj是调用这个方法的class或子类或接口 的实例,则返回true。
这个方法是instanceof运算符的动态等价
例:

    @Test
public void testIsInstance() {
/**
* 作用范围与instanceof相同
*/
ParentClass parentClass = new ParentClass();
assertThat(Serializable.class.isInstance(parentClass)).isEqualTo(true);
assertThat(ParentClass.class.isInstance(parentClass)).isEqualTo(true);
assertThat(OneLevelChildClass.class.isInstance(parentClass)).isEqualTo(false);
assertThat(TwoLevelChildClass.class.isInstance(parentClass)).isEqualTo(false); OneLevelChildClass oneLevelChildClass = new OneLevelChildClass();
assertThat(Serializable.class.isInstance(oneLevelChildClass)).isEqualTo(true);
assertThat(ParentClass.class.isInstance(oneLevelChildClass)).isEqualTo(true);
assertThat(OneLevelChildClass.class.isInstance(oneLevelChildClass)).isEqualTo(true);
assertThat(TwoLevelChildClass.class.isInstance(oneLevelChildClass)).isEqualTo(false); TwoLevelChildClass twoLevelChildClass = new TwoLevelChildClass();
assertThat(Serializable.class.isInstance(twoLevelChildClass)).isEqualTo(true);
assertThat(ParentClass.class.isInstance(twoLevelChildClass)).isEqualTo(true);
assertThat(OneLevelChildClass.class.isInstance(twoLevelChildClass)).isEqualTo(true);
assertThat(TwoLevelChildClass.class.isInstance(twoLevelChildClass)).isEqualTo(true);
}

Class类的isAssignableFrom(Class cls)方法,如果调用这个方法的class或接口 与 参数cls表示的类或接口相同,或者是参数cls表示的类或接口的父类,则返回true。
形象地:自身类.class.isAssignableFrom(自身类或子类.class) 返回true
例:

    @Test
public void testIsAssignableFrom() {
ParentClass parentClass = new ParentClass();
assertThat(parentClass.getClass().isAssignableFrom(Serializable.class)).isEqualTo(false);
/**
* 当前类及子类都返回true。父类及接口返回false
*/
assertThat(parentClass.getClass().isAssignableFrom(ParentClass.class)).isEqualTo(true);
assertThat(parentClass.getClass().isAssignableFrom(OneLevelChildClass.class)).isEqualTo(true);
assertThat(parentClass.getClass().isAssignableFrom(TwoLevelChildClass.class)).isEqualTo(true); OneLevelChildClass oneLevelChildClass = new OneLevelChildClass();
assertThat(oneLevelChildClass.getClass().isAssignableFrom(Serializable.class)).isEqualTo(false);
assertThat(oneLevelChildClass.getClass().isAssignableFrom(ParentClass.class)).isEqualTo(false);
/**
* 当前类及子类都返回true。父类及接口返回false
*/
assertThat(oneLevelChildClass.getClass().isAssignableFrom(OneLevelChildClass.class)).isEqualTo(true);
assertThat(oneLevelChildClass.getClass().isAssignableFrom(TwoLevelChildClass.class)).isEqualTo(true); TwoLevelChildClass twoLevelChildClass = new TwoLevelChildClass();
assertThat(twoLevelChildClass.getClass().isAssignableFrom(Serializable.class)).isEqualTo(false);
assertThat(twoLevelChildClass.getClass().isAssignableFrom(ParentClass.class)).isEqualTo(false);
assertThat(twoLevelChildClass.getClass().isAssignableFrom(OneLevelChildClass.class)).isEqualTo(false);
/**
* 当前类及子类都返回true。父类及接口返回false
*/
assertThat(twoLevelChildClass.getClass().isAssignableFrom(TwoLevelChildClass.class)).isEqualTo(true);
}
System.out.println(ArrayList.class.isAssignableFrom(Object.class)); //false
System.out.println(Object.class.isAssignableFrom(ArrayList.class)); //true
System.out.println("String是Object的父类:"+String.class.isAssignableFrom(Object.class)); //false
System.out.println("Object是String的父类:"+Object.class.isAssignableFrom(String.class)); //true
System.out.println("Object和Object相同:"+Object.class.isAssignableFrom(Object.class)); //true

https://www.cnblogs.com/exmyth/p/3164492.html
https://www.cnblogs.com/bethunebtj/p/4681438.html

    @Test
public void testArrayInClassMethod() {
Integer[] intTypes = {1, 2};
assertThat(intTypes.getClass().isArray()).isTrue();
assertThat(intTypes instanceof Integer[]).isTrue();
// assertThat(intTypes instanceof int[]); //会编译报错:不兼容的类型
assertThat(intTypes instanceof Object[]).isTrue(); assertThat(Integer[].class.isInstance(intTypes)).isTrue();
assertThat(Object[].class.isInstance(intTypes)).isTrue();
// assertThat(intTypes instanceof String[]).isTrue();//会编译报错:不兼容的类型
assertThat(intTypes.getClass().isAssignableFrom(Object[].class)).isFalse();
assertThat(intTypes.getClass().isAssignableFrom(Integer[].class)).isTrue(); /**
* 当前类及子类都返回true。父类及接口返回false
*/
assertThat(intTypes.getClass().isAssignableFrom(Object[].class)).isFalse();
assertThat(intTypes.getClass().isAssignableFrom(Integer[].class)).isTrue(); Object[] objects = {1, 2};
assertThat(objects instanceof Integer[]).isFalse();
assertThat(objects instanceof Object[]).isTrue(); assertThat(Integer[].class.isInstance(objects)).isFalse();//具体到抽象的为false
assertThat(Object[].class.isInstance(objects)).isTrue(); /**
* 当前类及子类都返回true。父类及接口返回false
*/
assertThat(objects.getClass().isAssignableFrom(Object[].class)).isTrue();
assertThat(objects.getClass().isAssignableFrom(Integer[].class)).isTrue();
}
    /**
* Determines if the specified {@code Object} is assignment-compatible
* with the object represented by this {@code Class}. This method is
* the dynamic equivalent of the Java language {@code instanceof}
* operator. The method returns {@code true} if the specified
* {@code Object} argument is non-null and can be cast to the
* reference type represented by this {@code Class} object without
* raising a {@code ClassCastException.} It returns {@code false}
* otherwise.
*
* <p> Specifically, if this {@code Class} object represents a
* declared class, this method returns {@code true} if the specified
* {@code Object} argument is an instance of the represented class (or
* of any of its subclasses); it returns {@code false} otherwise. If
* this {@code Class} object represents an array class, this method
* returns {@code true} if the specified {@code Object} argument
* can be converted to an object of the array class by an identity
* conversion or by a widening reference conversion
; it returns
* {@code false} otherwise. If this {@code Class} object
* represents an interface, this method returns {@code true} if the
* class or any superclass of the specified {@code Object} argument
* implements this interface; it returns {@code false} otherwise. If
* this {@code Class} object represents a primitive type, this method
* returns {@code false}.
*
* @param obj the object to check
* @return true if {@code obj} is an instance of this class
*
* @since JDK1.1
*/
public native boolean isInstance(Object obj);
    /**
* Determines if the class or interface represented by this
* {@code Class} object is either the same as, or is a superclass or
* superinterface of
, the class or interface represented by the specified
* {@code Class} parameter. It returns {@code true} if so;
* otherwise it returns {@code false}. If this {@code Class}
* object represents a primitive type, this method returns
* {@code true} if the specified {@code Class} parameter is
* exactly this {@code Class} object; otherwise it returns
* {@code false}.
*
* <p> Specifically, this method tests whether the type represented by the
* specified {@code Class} parameter can be converted to the type
* represented by this {@code Class} object via an identity conversion
* or via a widening reference conversion. See <em>The Java Language
* Specification</em>, sections 5.1.1 and 5.1.4 , for details.
*
* @param cls the {@code Class} object to be checked
* @return the {@code boolean} value indicating whether objects of the
* type {@code cls} can be assigned to objects of this class
* @exception NullPointerException if the specified Class parameter is
* null.
* @since JDK1.1
*/
public native boolean isAssignableFrom(Class<?> cls);

org.springframework.messaging.handler.annotation.support.PayloadMethodArgumentResolver#isEmptyPayload

    /**
* Specify if the given {@code payload} is empty.
* @param payload the payload to check (can be {@code null})
*/
protected boolean isEmptyPayload(@Nullable Object payload) {
if (payload == null) {
return true;
}
else if (payload instanceof byte[]) {
return ((byte[]) payload).length == 0;
}
else if (payload instanceof String) {
return !StringUtils.hasText((String) payload);
}
else {
return false;
}
}

java isAssignableFrom instanceof 小结 专题的更多相关文章

  1. java中instanceof和getClass()的作用

    初学者难免有点混淆java中instanceof和getClass()的作用,  下面就来一一讲解. 父类A: class A { } 子类B: class B extends A { }  构造对象 ...

  2. 深入Java关键字instanceof

    深入Java关键字instanceof   instanceof关键字用于判断一个引用类型变量所指向的对象是否是一个类(或接口.抽象类.父类)的实例.   举个例子: public interface ...

  3. java并发包小结(二)

    接上一篇 java并发包小结(一):http://blog.csdn.net/aalansehaiyang52/article/details/8877579 Future 接口Future 接口允许 ...

  4. Java-Runoob-高级教程-实例-方法:07. Java 实例 – instanceOf 关键字用法

    ylbtech-Java-Runoob-高级教程-实例-方法:07. Java 实例 – instanceOf 关键字用法 1.返回顶部 1. Java 实例 - instanceof 关键字用法   ...

  5. Java关键字instanceof

    深入Java关键字instanceof   instanceof关键字用于判断一个引用类型变量所指向的对象是否是一个类(或接口.抽象类.父类)的实例.   举个例子:   public interfa ...

  6. Java中instanceof和isInstance的具体区别

    Java中instanceof和isInstance的具体区别 在Think in Java泛型这一章遇到这个问题,一些博客模糊提到了isInstance是instanceof的动态实现,查阅文档参考 ...

  7. Java 实例 - instanceof 关键字用法

    Java 实例 - instanceof 关键字用法 instanceof 是 Java 的一个二元操作符,类似于 ==,>,< 等操作符. instanceof 是 Java 的保留关键 ...

  8. java IO 流小结

    java IO 流小结 java流类图结构 流的分类 按方向 输入流 输出流 按类型 字节流 字符流 结论:只要是处理纯文本数据,就优先考虑使用字符流. 除此之外都使用字节流.

  9. 图灵学院JAVA互联网架构师专题学习笔记

    图灵学院JAVA互联网架构师专题学习笔记 下载链接:链接: https://pan.baidu.com/s/1xbxDzmnQudnYtMt5Ce1ONQ 密码: fbdj如果失效联系v:itit11 ...

随机推荐

  1. Understand JavaScript Callback Functions and Use Them

    In JavaScript, functions are first-class objects; that is, functions are of the type Object and they ...

  2. SQL Server 2008将数据导出为脚本 [SQL Server]

    之前我们要将一个表中的数据导出为脚本,那么只有在网上找一个导出数据的Script,然后运行就可以导出数据脚本了.现在在SQL Server 2008的Management Studio中增加了一个新特 ...

  3. FFmpeg在Linux下搭建 ***

    今天介绍下FFmpeg在Linux下安装编译过程,总体过程比较顺利,就是在ffmpeg等的时间稍长点,仅当记录. 关于FFmpeg FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采 ...

  4. kafka之二:Kafka 设计与原理详解

    一.Kafka简介 本文综合了我之前写的kafka相关文章,可作为一个全面了解学习kafka的培训学习资料. 转载请注明出处 : 本文链接 1.1 背景历史 当今社会各种应用系统诸如商业.社交.搜索. ...

  5. vue watch 深度监听以及立即监听

    vue watch对象可以监听数据,数据发生变化,处理函数 watch虽可以监听,但只是浅监听,只监听数据第一层或者第二层.比如对于整个对象的监听,需要用到深度监听 vm.$watch('obj',f ...

  6. 关于group_concat函数拼接字符超长的问题

    昨天测试的人火急火燎的找我,跟我说数据不对!说明情况后我去查看,原来是数据上有个子查询出来的字段没有完全展示 问题很明显,就是数据被截断了.下面贴上我写的查询 wyids_是正确的显示,通过它子查询出 ...

  7. CentOS6.6 zookeeper完全集群搭建

    centos6.6搭建zookeeper-3.4.6完全分布式环境 转载 2015-06-28 22:14:17 标签:it 为了搭建HBase完全分布式环境,前提就是搭建好zookeeper和Had ...

  8. 优化 SQL Server CPU 性能

    本文將探討在使用SQL Server時有那些原因可能會造成過度消耗CPU資源,若CPU使用率管理不善或過度使用CPU資源的話,可能會對SQL Server有明顯的影響,建議您需要增加或更換CPU.. ...

  9. Linux安装ntp同步时间

    1.安装 yum install  ntp 安装下就可以了. 2.寻找一个网络时间服务器,比如一些国家授时中心 微软公司授时主机(美国) time.windows.com 台警大授时中心(台湾) as ...

  10. 系统管理常用Linux命令

    1.查看系统运行时间.用户数.负载 uptime 11:00:39 up 3 days,  1:08,  1 user,  load average: 0.00, 0.01, 0.05 解析:后面的三 ...