instanceof关键字主要用来判断两个对象是否为同一种类型,举个例子如果有猫类、动物类,猫类继承自动物类;

判断某个类是否为动物类,就可以使用instanceof关键字。下面简单介绍几种真实的应用场景.

场景一:工具类中判断某个类是否为null或者是为空;代码如下:

public static boolean judgmentObjectIsEmpty(Object object) {

if (object == null) {

return true;

}

if (object instanceof Map) {

Map map = (Map)object;

return map.isEmpty();

} else if (object instanceof List) {

List list = (List)object;

return list.isEmpty();

} else if (object instanceof String) {

String str = (String)object;

return "null".equals(str) || "".equals(str);

}

return false;

}

Instanceof 主要用于判断任意一个类是否为Map集合、List集合、String字符串。

场景二:过滤器中使用自定义增强的request请求,在强制转换前先判断一下是否属于同一种类型;

public class BodyReaderFilter implements Filter {

@Override

public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {

ServletRequest requestWrapper = null;

if (request instanceof HttpServletRequest) {

requestWrapper = new BodyReaderWrapper((HttpServletRequest)request);

}

if (requestWrapper == null) {

filterChain.doFilter(request, response);

} else {

filterChain.doFilter(requestWrapper, response);

}

}

}

import org.springframework.util.StreamUtils;

import javax.servlet.ReadListener;

import javax.servlet.ServletInputStream;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletRequestWrapper;

import java.io.BufferedReader;

import java.io.ByteArrayInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

/**

* @Description: 自定义 request 增强类,解决在一次请求中输入流只能获取一次请求参数的问题

* @ClassName: BodyReaderWrapper

* @author: dengchao

* @date: 2021/8/18 15:43

*/

public class BodyReaderWrapper extends HttpServletRequestWrapper{

//用于将流保存下来

private byte[] requestBody;

public BodyReaderWrapper(HttpServletRequest request) throws IOException {

super(request);

//2021-10-19 将从请求头中获取的token请求信息放到 请求体中

String tempToken = request.getHeader("loginToken");

System.out.println("从请求头中获取的token信息8585--->" + tempToken);

request.setAttribute("loginToken", tempToken);

requestBody = StreamUtils.copyToByteArray(request.getInputStream());

}

@Override

public ServletInputStream getInputStream() throws IOException {

final ByteArrayInputStream bais = new ByteArrayInputStream(requestBody);

return new ServletInputStream() {

@Override

public int read() throws IOException {

return bais.read();

}

@Override

public boolean isFinished() {

return false;

}

@Override

public boolean isReady() {

return false;

}

@Override

public void setReadListener(ReadListener readListener) {

}

};

}

@Override

public BufferedReader getReader() throws IOException {

return new BufferedReader(new InputStreamReader(getInputStream()));

}

}

场景三: 自定义注解中用于校验时使用;

/**

* 枚举校验注解

*/

@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})

@Retention(RUNTIME)

@Documented

@Constraint(validatedBy = {EnumValueValidator.class})

public @interface EnumValue {

// 默认错误消息

String message() default "必须为指定值";

String[] strValues() default {};

int[] intValues() default {};

// 分组

Class<?>[] groups() default {};

// 负载

Class<? extends Payload>[] payload() default {};

// 指定多个时使用

@Target({FIELD, METHOD, PARAMETER, ANNOTATION_TYPE})

@Retention(RUNTIME)

@Documented

@interface List {

EnumValue[] value();

}

}

public class EnumValueValidator implements ConstraintValidator<EnumValue, Object> {

private String[] strValues;

private int[] intValues;

@Override

public void initialize(EnumValue constraintAnnotation) {

strValues = constraintAnnotation.strValues();

intValues = constraintAnnotation.intValues();

}

@Override

public boolean isValid(Object value, ConstraintValidatorContext context) {

if (value instanceof String) {

for (String s : strValues) {

if (s.equals(value)) {

return true;

}

}

} else if (value instanceof Integer) {

for (int s : intValues) {

if (s == ((Integer) value).intValue()) {

return true;

}

}

}

return false;

}

}

这个是注解的作用是校验某些固定的参数值,可以是整数或者字符串。注解在处理的时候使用到instanceof这个关键字,

主要用于判断一个Object对象是String字符串类型还是Integer类型,这个注解已经在项目中使用起来;参考文章:

https://www.cnblogs.com/pojo/p/15054698.html

场景四:JSON转换工具类中使用;

/**

* 对象转化为json字符串

* @param obj 待转化对象

* @return 代表该对象的Json字符串

*/

public static final String toJson(final Object obj) {

//当参数为String类型 直接返回该字符串

if(obj instanceof String){

return (String)obj;

}

return JSON.toJSONString(obj);

}

这个地方使用的时候,先判断一下需要转换的对象是否为String类型,如果是则直接返回,如果不是在使用JSON进行转换。

场景五: 判断某两个异常是否为同一种异常类型;

@ExceptionHandler(value = Exception.class)

public ResponseEntity<JsonResult<Object>> baseErrorHandler(Exception ex) {

JsonResult<Object> r = new JsonResult<>();

if (ex instanceof BaseException || ex.getClass().isAssignableFrom(BaseException.class)) {

r.declareFailure((BaseException) ex, null);

logger.error(((BaseException) ex).getErrorMessage(), ex);

} else {

r.declareFailure(MessageConstant.A000001, "系统未知异常,服务无法正常使用", null);

logger.error(ex.getMessage(), ex);

}

return ResponseEntity.ok(r);

}

场景六:使用JSONObject或者JSONArray的时候,类型转换前先进行类型的判断;

Object record = data.getRecords();

String erCode = "";

String erMsg = "";

if(record instanceof JSONObject) {

erCode = ((JSONObject) record).getString("erCode");

erMsg = ((JSONObject) record).getString("erMsg");

} else if (record instanceof JSONArray && ((JSONArray) record).size() > 0){

Object obj = ((JSONArray) record).get(0);

erCode = ((JSONObject) obj).getString("erCode");

erMsg = ((JSONObject) obj).getString("erMsg");

}

待转换的数据有可能是单个对象,也有可能是数组,这种处理方式可以避免类型转换异常而出现错误。

总结: instanceof关键字一般主要用于包装类在进行强制转换之前,先判断一下需要转换的两个类是否为同一种类型,如果是则

可以进行强制转换,如果不是则做其他处理。这样处理的好处是可以大概率的避免出现类型转换异常,

java.lang.ClassCastException。之前在开发中就曾出现过这个异常,在使用Mybatis中自定义的拦截器的时候,参数转换出现

异常,导致请求时频繁出现异常。大致错误就是就是参数不能直接转换为HashMap,解决办法就是使用instanceof判断一下

参数instanceof HashMap,如果是则转换为HashMap集合,然后直接从集合里面取数据。不是的话就转换为其他类型,这样

就很好的解决掉BUG.

Java中关键字-instanceof-的真实应用场景-2022新项目的更多相关文章

  1. java 中的instanceof的用法

    instanceof 运算符是Java.php的一个二元操作符(运算符),和==.>.<是同一类东西.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是判断其左边对象是否为其右 ...

  2. java中的instanceof

    instanceof是Java.php的一个二元操作符(运算符),和==,>,<是同一类东西.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是判断其左边对象是否为其右边类的实 ...

  3. 【Java基础】1、java中的instanceof

    instanceof是Java.php的一个二元操作符(运算符),和==,>,<是同一类东西.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是判断其左边对象是否为其右边类的实 ...

  4. Java 中的instanceof简单讲解

    Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法:resu ...

  5. java 中的instanceof

    java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法:resu ...

  6. Java 中的instanceof 运算符

    Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法:resu ...

  7. Java中关键字continue、break和return的区别

    Java中关键字continue.break和return的区别: continue:跳出本次循环继续下一次循环 break:   跳出循环体,继续执行循环外的函数体 return:   跳出整个函数 ...

  8. java中的instanceof用法

    Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法:     ...

  9. java中的instanceof方法

    本文主要讲述java中的instanceof()方法. 示例代码如下: public class InstanceTest { public static void main(String[] arg ...

  10. [zz]Java中的instanceof关键字

    1.What is the 'instanceof' operator used for? stackoverflow的一个回答:http://stackoverflow.com/questions/ ...

随机推荐

  1. 设计模式学习-使用go实现迭代器模式

    迭代器模式 定义 优点 缺点 适用范围 代码实现 参考 迭代器模式 定义 迭代器模式(Iterator Design Pattern),也叫作游标模式(Cursor Design Pattern). ...

  2. HarmonyOS实战[三]—可编辑的卡片交互

    相关文章: HarmonyOS实战[一]--原理概念介绍安装:基础篇 HarmonyOS实战[二]-超级详细的原子化服务体验[可编辑的卡片交互]快来尝试吧 [本文正在参与"有奖征文|Harm ...

  3. 人工智能创新挑战赛:海洋气象预测Baseline[4]完整版(TensorFlow、torch版本)含数据转化、模型构建、MLP、TCNN+RNN、LSTM模型训练以及预测

    人工智能创新挑战赛:海洋气象预测Baseline[4]完整版(TensorFlow.torch版本)含数据转化.模型构建.MLP.TCNN+RNN.LSTM模型训练以及预测 1.赛题简介 项目链接以及 ...

  4. C# 使用正则表达式

    在C#中,可以使用正则表达式来处理文本字符串.正则表达式是一种特殊的文本模式,用于匹配和搜索字符串.它可以识别特定模式,如邮箱地址.电话号码.网址等.正则表达式是C#中常用的一种文本处理技术,使用它可 ...

  5. 基于OpenEuler的信创国产瘦客户机软件系统 DoraOS

    DoraOS是一款瘦客户机系统软件,最新版本基于OpenEuler开发.可以将主机转化为专业的瘦客户机.目前支持x86架构的硬件. 软件下载地址为: https://www.doracloud.cn/ ...

  6. pandas教程01: pandas的安装和基本操作

      pandas是Python中常用的数据处理库,主要用来处理表格数据,类似于下面这种: 好好干文化有限公司员工薪资表 姓名 年龄 性别 年薪 奖金 久九刘 35 男 182600 42000 傅儿待 ...

  7. VMware16.0-16.1.2去虚拟化过SE检测教程小白专享

    这里是VM16.0-16.1.2的修改教程 以下所需要的工具百度一下就可以了 winhex硬件修改器 bios修改器 安装过程就不多做介绍吧,直接进入修改过程,还不会的小伙伴搜一下百度自行安装即可 安 ...

  8. NC51112 Stars in Your Window

    题目链接 题目 题目描述 Fleeting time does not blur my memory of you. Can it really be 4 years since I first sa ...

  9. spring boot+sqlite+mybatis实现增删改查例子

    主要是更换了下sqlite的数据源而已,其他代码不变. 我都贴一下吧,这个算是比较通用的基础增删改查代码. 1.创建test.db 可以使用Idea自带的Database插件配置,也可以命令行创建,具 ...

  10. oracle exp/imp命令使用parfile实现参数文件调用

    优先使用数据泵(expdp/impdp)方式,更高效,问题少. 关于exp/imp工具的使用请参考我的另一篇文章: https://blog.csdn.net/IndexMan/article/det ...