方法调用:

(Class<? extends T>) ResolvableType.forClass(AbstractFailureAnalyzer.class, getClass()).resolveGeneric();

其中参数 getClass() 的值:class org.springframework.boot.diagnostics.AbstractFailureAnalyzer


/********** org.springframework.core.ResolvableType ******************/
public static ResolvableType forClass(Class<?> baseType, Class<?> implementationClass) {Assert.notNull(baseType, "Base type must not be null");// implementationClass : PortInUseFailureAnalyzer// baseType : AbstractFailureAnalyzerResolvableType asType = forType(implementationClass).as(baseType);return (asType == NONE ? forType(baseType) : asType);
}
static ResolvableType forType(@Nullable Type type, @Nullable TypeProvider typeProvider, @Nullable VariableResolver variableResolver) {if (type == null && typeProvider != null) {type = SerializableTypeWrapper.forTypeProvider(typeProvider);}if (type == null) {return NONE;}// For simple Class references, build the wrapper right away -// no expensive resolution necessary, so not worth caching...if (type instanceof Class) {// 端口占用异常直接在这里返回return new ResolvableType(type, typeProvider, variableResolver, (ResolvableType) null);}// Purge empty entries on access since we don't have a clean-up thread or the like.cache.purgeUnreferencedEntries();// Check the cache - we may have a ResolvableType which has been resolved before...ResolvableType resultType = new ResolvableType(type, typeProvider, variableResolver);ResolvableType cachedType = cache.get(resultType);if (cachedType == null) {cachedType = new ResolvableType(type, typeProvider, variableResolver, resultType.hash);cache.put(cachedType, cachedType);}resultType.resolved = cachedType.resolved;return resultType;
}private ResolvableType(Type type, @Nullable TypeProvider typeProvider,@Nullable VariableResolver variableResolver, @Nullable ResolvableType componentType) {this.type = type;this.typeProvider = typeProvider;this.variableResolver = variableResolver;this.componentType = componentType;this.hash = null;this.resolved = resolveClass();
}
@Nullable
private Class<?> resolveClass() {if (this.type == EmptyType.INSTANCE) {return null;}if (this.type instanceof Class) {// 本例直接在这里返回this.type,也就是实际的类型return (Class<?>) this.type;}if (this.type instanceof GenericArrayType) {Class<?> resolvedComponent = getComponentType().resolve();return (resolvedComponent != null ? Array.newInstance(resolvedComponent, 0).getClass() : null);}return resolveType().resolve();
}
public ResolvableType getGeneric(@Nullable int... indexes) {ResolvableType[] generics = getGenerics();if (indexes == null || indexes.length == 0) {return (generics.length == 0 ? NONE : generics[0]);}ResolvableType generic = this;for (int index : indexes) {generics = generic.getGenerics();if (index < 0 || index >= generics.length) {return NONE;}generic = generics[index];}return generic;
}
public ResolvableType[] getGenerics() {if (this == NONE) {return EMPTY_TYPES_ARRAY;}ResolvableType[] generics = this.generics;if (generics == null) {if (this.type instanceof Class) {Type[] typeParams = ((Class<?>) this.type).getTypeParameters();generics = new ResolvableType[typeParams.length];for (int i = 0; i < generics.length; i++) {generics[i] = ResolvableType.forType(typeParams[i], this);}}else if (this.type instanceof ParameterizedType) {Type[] actualTypeArguments = ((ParameterizedType) this.type).getActualTypeArguments();generics = new ResolvableType[actualTypeArguments.length];for (int i = 0; i < actualTypeArguments.length; i++) {generics[i] = forType(actualTypeArguments[i], this.variableResolver);}}else {generics = resolveType().getGenerics();}this.generics = generics;}return generics;
}

给this.generics赋值的调用栈

getGenerics:712, ResolvableType (org.springframework.core)
getGeneric:661, ResolvableType (org.springframework.core)
resolveGeneric:763, ResolvableType (org.springframework.core)
getCauseType:56, AbstractFailureAnalyzer (org.springframework.boot.diagnostics)
analyze:33, AbstractFailureAnalyzer (org.springframework.boot.diagnostics)
analyze:111, FailureAnalyzers (org.springframework.boot.diagnostics)
reportException:104, FailureAnalyzers (org.springframework.boot.diagnostics)
reportFailure:816, SpringApplication (org.springframework.boot)
handleRunFailure:801, SpringApplication (org.springframework.boot)
run:325, SpringApplication (org.springframework.boot)
setInitializer:30, HelloSpringBootApplication (com.yh.stu.springboot)
main:24, HelloSpringBootApplication (com.yh.stu.springboot)getGenerics:693, ResolvableType (org.springframework.core)
getGeneric:661, ResolvableType (org.springframework.core)
resolveGeneric:763, ResolvableType (org.springframework.core)
getCauseType:56, AbstractFailureAnalyzer (org.springframework.boot.diagnostics)
analyze:33, AbstractFailureAnalyzer (org.springframework.boot.diagnostics)
analyze:111, FailureAnalyzers (org.springframework.boot.diagnostics)
reportException:104, FailureAnalyzers (org.springframework.boot.diagnostics)
reportFailure:816, SpringApplication (org.springframework.boot)
handleRunFailure:801, SpringApplication (org.springframework.boot)
run:325, SpringApplication (org.springframework.boot)
setInitializer:30, HelloSpringBootApplication (com.yh.stu.springboot)
main:24, HelloSpringBootApplication (com.yh.stu.springboot)

案例1 PortInUseFailureAnalyzer.getCauseType

getCauseType 在父类 AbstractFailureAnalyzer

/********** org.springframework.boot.diagnostics.AbstractFailureAnalyzer ******************/protected Class<? extends T> getCauseType() {// getClass() 调用的是子类PortInUseFailureAnalyzer的 classreturn (Class<? extends T>) ResolvableType.forClass(AbstractFailureAnalyzer.class, getClass()).resolveGeneric();
}/********** org.springframework.core.ResolvableType ******************/
public static ResolvableType forClass(Class<?> baseType, Class<?> implementationClass) {Assert.notNull(baseType, "Base type must not be null");ResolvableType asType = forType(implementationClass).as(baseType);return (asType == NONE ? forType(baseType) : asType);
}

我们将 ResolvableType asType = forType(implementationClass).as(baseType) 这行代码拆分一下:

// implementationClass 就是 PortInUseFailureAnalyzer.class
ResolvableType forType= forType(implementationClass);
// baseType 就是 AbstractFailureAnalyzer.class
ResolvableType asType = forType.as(baseType);

1、创建 PortInUseFailureAnalyzer 的 ResolvableType

this.type = PortInUseFailureAnalyzer.class
this.resolved = PortInUseFailureAnalyzer.class

2、创建父类 AbstractFailureAnalyzer 的 ResolvableType

/********** org.springframework.core.ResolvableType ******************/
public ResolvableType as(Class<?> type) {if (this == NONE) {return NONE;}Class<?> resolved = resolve();// 方法就是 return this.resolved,PortInUseFailureAnalyzer.classif (resolved == null || resolved == type) {return this;}for (ResolvableType interfaceType : getInterfaces()) { // 方法返回空集合ResolvableType interfaceAsType = interfaceType.as(type);if (interfaceAsType != NONE) {return interfaceAsType;}}return getSuperType().as(type);
}public ResolvableType getSuperType() {Class<?> resolved = resolve();// 方法就是 return this.resolved,PortInUseFailureAnalyzer.classif (resolved == null || resolved.getGenericSuperclass() == null) {return NONE;}ResolvableType superType = this.superType;if (superType == null) {// 创建superType = forType(resolved.getGenericSuperclass(), this);this.superType = superType;}return superType;
}public static ResolvableType forType(@Nullable Type type, @Nullable ResolvableType owner) {VariableResolver variableResolver = null;if (owner != null) {variableResolver = owner.asVariableResolver();}return forType(type, variableResolver);
}

ResolvableType asType = rt.as(AbstractFailureAnalyzer.class)

A 附录、ResolvableType相关推荐

  1. 附录G Netty与NettyUtils

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/beliefer/article/details/77450134 注:本文是为了配合<Spar ...

  2. 劣质代码评析——《写给大家看的C语言书(第2版)》附录B之21点程序(一)

    <写给大家看的C语言书(第2版)>是邮电社图灵公司引进翻译的一本C语言入门书,这是一本垃圾书.搞不清图灵为什么引进了这样一本垃圾书.该书作者基本不懂得C编程技术,书中误导.错谬比比皆是. ...

  3. ovirt官方安装文档 附录F

    附录F:在单独的机器上安装Websocket代理 websocket代理允许用户通过noVNC和SPICE HTML5控制台连接到虚拟机.noVNC客户端使用websocket传递VNC数据.但是,Q ...

  4. 附录C 编译安装Hive

    如果需要直接安装Hive,可以跳过编译步骤,从Hive的官网下载编译好的安装包,下载地址为http://hive.apache.org/downloads.html . C.1  编译Hive C.1 ...

  5. dsp28335读地址c语言写法,dsp 28335 教程 附录4 dsp的c语言.ppt

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbsp嵌入式开发 dsp 28335 教程 附录4 dsp的c语言.p ...

  6. 【控制】《鲁棒控制-线性矩阵不等式处理方法》-俞立老师-附录-LMI工具箱介绍

    第3章 回到目录 第5章 附录-LMI工具箱介绍 A.1 线性矩阵不等式及相关术语 A.1 线性矩阵不等式及相关术语

  7. 《Spring Boot极简教程》附录4 Java编程简史

    附录4 Java编程简史 从GOTO到OOP 在20世纪60年代,软件曾出现过严重危机,由软件错误而引起的信息丢失.系统报废事件屡有发生.为此,1968年,荷兰E.W.Dijkstra提出了程序设计中 ...

  8. FreeBSD 6.0架设管理与应用-附录B 制作FreeBSD安装光盘

    附录B 制作 FreeBSD 安装光盘 如果您想要自行制作 FreeBSD 安装光盘,您可以自各大 FTP 站台下载 FreeBSD 回来自行烧录.FreeBSD 各个 RELEASE 版本推出时,都 ...

  9. [导入]php 安全基础 附录C. 加密

    附录C. 加密 作为一本相关安全方面的书,通常加密是需要提及的话题.我之所以在本书的主体部分忽略了加密问题,是因为它的用途是狭窄的,而开发者应从大处着眼来考虑安全问题.过分依赖于加密常常会混淆问题的根 ...

最新文章

  1. drawable自定义字体颜色
  2. windows c语言能分配多少内存,Windows下C语言程序的内存布局(内存模型)
  3. Ransomware Locky Analysis
  4. 【Linux】一步一步学Linux——man命令(有问题找男人)(13)
  5. 中webgl解析json_WebGL蒙皮(下)
  6. 作者:刘强(1990-),男,中国科学院自动化研究所博士生
  7. 用CSS的float和clear创建三栏液态布局的方法(转载)
  8. DataTable:执行DataTable.Select(条件)返回DataTable的解决方法
  9. nginx创建n个工作子进程
  10. 【人民币识别】基于matlab GUI RGB和BP神经网络的人民币识别系统【含Matlab源码 097期】
  11. PhpStorm WebStorm IDEA 官方汉化插件
  12. js在wap端获取定位_两款JS脚本判断手机浏览器类型跳转WAP手机网站
  13. macbook2015年早期版本更换三星1T 980nvme遇坑过程
  14. 关于GomezPeer赚钱的可行性调查
  15. dubbo线程池exhausted
  16. 【读懂Autosar代码】-1-概述
  17. Ltspice测量波形的相关数据
  18. VMware 只能打开一个.vmx,无法打开第二个
  19. 合数(数论基础概念)
  20. 记STM32之PWM学习笔记 ---PWM原理

热门文章

  1. Oracel 连接远端服务器
  2. php可以控制视频的尺寸吗吗,控制视频像素尺寸这样做
  3. android自定义键盘遮挡,Android软键盘遮挡的四种完美解决方案
  4. 树莓派开机后画面一闪之后黑屏的解决
  5. 鸿蒙智慧屏桌面,全球首发国产鸿蒙操作系统,荣耀智慧屏现场亲测
  6. java 序列化快捷键_IntelliJ IDEA生成 Serializable序列化UID的快捷键
  7. python3.6和2.7的区别_Python2.7与3.6的一些区别
  8. java图片框架_Java图片处理开源框架
  9. Redhat7离线安装mysql_linux 离线安装mysql7或者8
  10. Spring Boot之发送HTTP请求(RestTemplate详解)