Java中关键字-instanceof-的真实应用场景-2022新项目
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新项目的更多相关文章
- java 中的instanceof的用法
instanceof 运算符是Java.php的一个二元操作符(运算符),和==.>.<是同一类东西.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是判断其左边对象是否为其右 ...
- java中的instanceof
instanceof是Java.php的一个二元操作符(运算符),和==,>,<是同一类东西.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是判断其左边对象是否为其右边类的实 ...
- 【Java基础】1、java中的instanceof
instanceof是Java.php的一个二元操作符(运算符),和==,>,<是同一类东西.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是判断其左边对象是否为其右边类的实 ...
- Java 中的instanceof简单讲解
Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法:resu ...
- java 中的instanceof
java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法:resu ...
- Java 中的instanceof 运算符
Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法:resu ...
- Java中关键字continue、break和return的区别
Java中关键字continue.break和return的区别: continue:跳出本次循环继续下一次循环 break: 跳出循环体,继续执行循环外的函数体 return: 跳出整个函数 ...
- java中的instanceof用法
Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法: ...
- java中的instanceof方法
本文主要讲述java中的instanceof()方法. 示例代码如下: public class InstanceTest { public static void main(String[] arg ...
- [zz]Java中的instanceof关键字
1.What is the 'instanceof' operator used for? stackoverflow的一个回答:http://stackoverflow.com/questions/ ...
随机推荐
- 使用docker部署一个go应用
使用docker部署一个go应用 前言 直接部署 构建镜像 创建并运行容器 使用docker-compose部署 上传到docker-hub,然后拉取镜像,部署 参考 使用docker部署一个go应用 ...
- 大语言模型的预训练[2]:GPT、GPT2、GPT3、GPT3.5、GPT4相关理论知识和模型实现、模型应用以及各个版本之间的区别详解
大语言模型的预训练[2]:GPT.GPT2.GPT3.GPT3.5.GPT4相关理论知识和模型实现.模型应用以及各个版本之间的区别详解 1.GPT 模型 1.1 GPT 模型简介 在自然语言处理问题中 ...
- 6.9 Windows驱动开发:内核枚举进线程ObCall回调
在笔者上一篇文章<内核枚举Registry注册表回调>中我们通过特征码定位实现了对注册表回调的枚举,本篇文章LyShark将教大家如何枚举系统中的ProcessObCall进程回调以及Th ...
- 1.6 编写双管道ShellCode
本文将介绍如何将CMD绑定到双向管道上,这是一种常用的黑客反弹技巧,可以让用户在命令行界面下与其他程序进行交互,我们将从创建管道.启动进程.传输数据等方面对这个功能进行详细讲解.此外,本文还将通过使用 ...
- node版本控制工具nvm安装教程
一.安装nvm 查看node对应NPM:https://nodejs.org/en/about/previous-releases 1.卸载node,后删除node文件夹里的所有内容 2:安装nvm管 ...
- .net ELk 成功使用
原文地址: http://t.zoukankan.com/shousiji-p-15222276.html
- 自然语言开发AI应用,利用云雀大模型打造自己的专属AI机器人
如今,大模型层出不穷,这为自然语言处理.计算机视觉.语音识别和其他领域的人工智能任务带来了重大的突破和进展.大模型通常指那些参数量庞大.层数深.拥有巨大的计算能力和数据训练集的模型. 但不能不承认的是 ...
- NC18985 数字权重
题目链接 题目 题目描述 小a有一个n位的数字,但是它忘了各个位上的数是什么,现在请你来确定各个位上的数字,满足以下条件: 设第i位的数为ai,其中a1为最高位,an为最低位,K为给定的数字 不含前导 ...
- STM32F407VET6烧录出现flash download failed target dll has been cancelled
今天在通过stlink烧录一个长时间未用的STM32F407VET6 Black Board的时候, 出现错误 Internal command error Flash download failed ...
- 美团面试:Kafka如何处理百万级消息队列?
美团面试:Kafka如何处理百万级消息队列? 在今天的大数据时代,处理海量数据已成为各行各业的标配.特别是在消息队列领域,Apache Kafka 作为一个分布式流处理平台,因其高吞吐量.可扩展性.容 ...