这个例子中isAssignableFrom和instanceof有什么区别?

问题描述 投票:0回答:2

考虑以下代码:

@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
    @Resource
    private MessageSource messageSource;
    private HttpHeaders headers(){
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        return headers;
    }
    private ResponseError responseError(String message,HttpStatus statusCode){
        ResponseError responseError = new ResponseError();
        responseError.setStatus("error");
        responseError.setError(message);
        responseError.setStatusCode(statusCode.value());
        return responseError;
    }
    @ExceptionHandler(Exception.class)
    private ResponseEntity<Object> handleGeneral(Exception e, WebRequest request) {
        if (e.getClass().isAssignableFrom(UndeclaredThrowableException.class)) {
            UndeclaredThrowableException exception = (UndeclaredThrowableException) e;
            return handleBusinessException((BusinessException) exception.getUndeclaredThrowable(), request);
        } else {
            String message = messageSource.getMessage("error.server", new Object[]{e.getMessage()}, null);
            ResponseError error = responseError(message,HttpStatus.INTERNAL_SERVER_ERROR);
            return handleExceptionInternal(e, error, headers(), HttpStatus.INTERNAL_SERVER_ERROR, request);
        }
    }
    @ExceptionHandler({BusinessException.class})
    private ResponseEntity<Object> handleBusinessException(BusinessException e, WebRequest request) {
        ResponseError error = responseError(e.getMessage(),HttpStatus.CONFLICT);
        return handleExceptionInternal(e, error, headers(), HttpStatus.CONFLICT, request);
    }
}

更换最大的区别是什么

if (e.getClass().isAssignableFrom(UndeclaredThrowableException.class)) {

if (e instanceof UndeclaredThrowableException) {

19号线。

我找到了一些解释,但不够详细。我想了解应该使用 isAssignableFrom 或 instanceof 的情况。

java
2个回答
0
投票
e.getClass().isAssignableFrom(Whatever.class)

测试

e
的运行时类是否是Whatever
超类

e instanceof Whatever

测试

e
的运行时类是否是 Whatever
子类

在您的代码中,后者更有意义,但在现代 Java 中,有一种更短、更清晰的编写方式:

if (e instanceof Whatever w) {
    // w is now a variable of type Whatever
}

0
投票
  • isAssignableFrom:此方法检查一个 Class 对象表示的类是否与另一个 Class 对象表示的类相同,或者是其超类或超接口。它用于确定一个类是否可以从另一个类或接口分配。
  • instanceof:此运算符检查对象是否是特定类或接口的实例,包括子类的实例。它用于测试对象是否属于特定类型。
© www.soinside.com 2019 - 2024. All rights reserved.