获取代理类的父类(原始类)
我们通常会自定义一些注解加在类或者方法上面,然后在项目初始化的时候加载这些添加了自定义注解的类。如果我们在这些类或方法上还使用了其他自定义注解或者类似@Transactional注解,很可能在启动的时候会出现空指针异常。原因是用了多个注解,导致项目启动的时候拿到的是该类的代理对象,而不是原始类,可以使用getSuperclass()来获取其原始类。
例:
@Component
@Slf4j
public class HandlerDataFactory {private Map<String, HandlerData> handlerMap = new ConcurrentHashMap(256);@Resourceprivate SpringContextUtil springContextUtil;@PostConstructpublic void init() {//获取那些带上了@CustomAnnotation注解的处理实现类Map<String, Object> handlerMap = springContextUtil.getContext().getBeansWithAnnotation(CustomAnnotation.class);for (Object handler : handlerMap.values()) {//这里如果handler.getClass()是代理对象,则customAnnotation为nullCustomAnnotation customAnnotation = handler.getClass().getAnnotation(CustomAnnotation.class);String[] groups = customAnnotation.group();List<String> groupList = Lists.newArrayList(groups);groupList.forEach(group -> {if (Objects.nonNull(handlerMap.get(group))) {throw new RuntimeException(String.format("分组:【%s】重复,请检查!", group));}handlerMap.put(group, (HandlerData) handler);});}//转换为只读MaphandlerMap = Collections.unmodifiableMap(handlerMap);log.info("处理类加载完毕!size={}", handlerMap.size());}public Map<String, HandlerData> getHandlerMap() {return handlerMap;}
}
修改:
@Component
@Slf4j
public class HandlerDataFactory {private Map<String, HandlerData> handlerMap = new ConcurrentHashMap(256);@Resourceprivate SpringContextUtil springContextUtil;@PostConstructpublic void init() {//获取那些带上了@CustomAnnotation注解的处理实现类Map<String, Object> handlerMap = springContextUtil.getContext().getBeansWithAnnotation(CustomAnnotation.class);for (Object handler : handlerMap.values()) {//这里如果handler.getClass()是代理对象,则customAnnotation为nullCustomAnnotation customAnnotation = handler.getClass().getAnnotation(CustomAnnotation.class);//如果是代理对象,则获取其父类,即原始类if (Objects.isNull(customAnnotation)) {customAnnotation = handler.getClass().getSuperclass().getAnnotation(CustomAnnotation.class);}String[] groups = customAnnotation.group();List<String> groupList = Lists.newArrayList(groups);groupList.forEach(group -> {if (Objects.nonNull(handlerMap.get(group ))) {throw new RuntimeException(String.format("分组:【%s】重复,请检查!", group ));}handlerMap.put(group, (HandlerData) handler);});}//转换为只读MaphandlerMap = Collections.unmodifiableMap(handlerMap);log.info("处理类加载完毕!size={}", handlerMap.size());}public Map<String, HandlerData> getHandlerMap() {return handlerMap;}}
获取代理类的父类(原始类)相关推荐
- java中所有类的父类Object类介绍
知识点-- Object类概述 目标: 了解Object的概述和常用方法 路径: Object类的概述 Object类中常用的2个方法 讲解: Object类的概述 java.lang.Object类 ...
- 尚硅谷第五天课0722班 java-面向对象学习的三条主线-面向对象的思想概述- 类的元素- java类及类的成员-类的成员之方 法
面向对象学习的三条主线:* 1.类和类的组成(属性(或成员变量).方法.构造器:代码块(或初始化块).内部类)* 2.面向对象的特征:封装与隐藏.继承性.多态性.(抽象性)* 3.其它关键字的使用:t ...
- 什么是java类的继承_Java类与继承
在Java中,类文件是以.java为后缀的代码文件,在每个类文件中最多只允许出现一个public类,当有public类的时候,类文件的名称必须和public类的名称相同,若不存在public,则类文件 ...
- Java反射机制demo(四)—获取一个类的父类和实现的接口
2019独角兽企业重金招聘Python工程师标准>>> Java反射机制demo(四)-获取一个类的父类和实现的接口 1,Java反射机制得到一个类的父类 使用Class类中的get ...
- (反射):获取一个类的父类和父类的泛型
一.解决问题 获取一个类的父类和父类的泛型 二.实现 Student.java package Test3;public class Student {private String name;priv ...
- Java面试题(十四)----- 如何获取父类的类名字 ? 如何获取当前运行类的类名
Java面试题(十四)----- 如何获取父类的类名字 ? 如何获取当前运行类的类名 文章目录
- java 获取父类的方法_java 获取类和父类的属性和方法
问题 在日常开发中,经常需要获取当前类和父类的所有属性,没办法只能查API了. getDeclaredFields VS getFields 查阅API得知,class.getDeclaredFiel ...
- 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | AMS 启动前使用动态代理替换掉插件 Activity 类 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- java代理的学习,通过类实现接口来实现代理。proxy来创建动态类,和InvocationHandler接口的实现,和工作原理。...
1.java自带的proxy类可以创建动态类,如果一个类实现了一个接口那么久可以为这个类创建代理. 2.代理:就是当用户要调用一个类的方法时,用户可以通过调用代理,代理通过接口调用原来的类的方法,代理 ...
最新文章
- 陕西信息计算机学校,陕西计算机信息专业学校
- 20155308郝文菲--第三次作业
- sqlserver的索引创建
- 罗斯蒙特电磁流量计8723说明书_罗斯蒙特8732EM电磁流量计变送器如何接线!
- pvbrowser安装教程(Linux)
- 公共mysql数据库_公共MySQL的数据库服务器层
- 谈谈NiTE 2手部跟踪在彩色图像上的显示
- c语言多维数组基础知识,C语言基础第7章多维数组.ppt
- Java笔记-使用RabbitMQ的Java接口实现Routing(路由模式)
- Table中合并相同内容列+Excel中合并相同内容列。
- 机器视觉齿轮质量快速检测
- pypi 镜像使用帮助——临时使用镜像网站
- SAP报表程序的下载上传
- WidsMob ImageConvert for Mac(图片格式转换器)
- 【双拼】双拼输入法入门指南
- 3656. 心与心的距离
- csp php,CSP策略及绕过方法
- 软件工程与计算:第3章需求分析 测试
- hdu5651xiaoxin juju needs help(大组合数模板)
- C语言之strcmp函数和strncmp函数
热门文章
- Macnbsp;OSnbsp;Xnbsp;Snownbsp;Leopardnbsp;10.6下载及…
- springmvc项目搭建过程中遇到的BUG及其解决方法
- 深度学习100例 | 第43天:文本卷积神经网络(TextCNN)新闻文本分类实战
- 消防大数据平台建设解决方案
- FANUC机器人伺服放大器的标准设置和电缆连接功能说明
- 【前端】【vue.js】【参考项目】vue-konva-project
- 你所经历过的传销是这样的吗?
- linux 预览md文件_微软 Win10 Dev 预览版 20246 发布:来自最新 FE_RELEASE 开发分支 - Windows 10,微软...
- c语言数组练习(录入商品价格信息,逆序排列等)
- Win7+Visual Basic V6.0精简版安装过程中的问题