我们通常会自定义一些注解加在类或者方法上面,然后在项目初始化的时候加载这些添加了自定义注解的类。如果我们在这些类或方法上还使用了其他自定义注解或者类似@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;}}

获取代理类的父类(原始类)相关推荐

  1. java中所有类的父类Object类介绍

    知识点-- Object类概述 目标: 了解Object的概述和常用方法 路径: Object类的概述 Object类中常用的2个方法 讲解: Object类的概述 java.lang.Object类 ...

  2. 尚硅谷第五天课0722班 java-面向对象学习的三条主线-面向对象的思想概述- 类的元素- java类及类的成员-类的成员之方 法

    面向对象学习的三条主线:* 1.类和类的组成(属性(或成员变量).方法.构造器:代码块(或初始化块).内部类)* 2.面向对象的特征:封装与隐藏.继承性.多态性.(抽象性)* 3.其它关键字的使用:t ...

  3. 什么是java类的继承_Java类与继承

    在Java中,类文件是以.java为后缀的代码文件,在每个类文件中最多只允许出现一个public类,当有public类的时候,类文件的名称必须和public类的名称相同,若不存在public,则类文件 ...

  4. Java反射机制demo(四)—获取一个类的父类和实现的接口

    2019独角兽企业重金招聘Python工程师标准>>> Java反射机制demo(四)-获取一个类的父类和实现的接口 1,Java反射机制得到一个类的父类 使用Class类中的get ...

  5. (反射):获取一个类的父类和父类的泛型

    一.解决问题 获取一个类的父类和父类的泛型 二.实现 Student.java package Test3;public class Student {private String name;priv ...

  6. Java面试题(十四)----- 如何获取父类的类名字 ? 如何获取当前运行类的类名

    Java面试题(十四)----- 如何获取父类的类名字 ? 如何获取当前运行类的类名 文章目录

  7. java 获取父类的方法_java 获取类和父类的属性和方法

    问题 在日常开发中,经常需要获取当前类和父类的所有属性,没办法只能查API了. getDeclaredFields VS getFields 查阅API得知,class.getDeclaredFiel ...

  8. 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | AMS 启动前使用动态代理替换掉插件 Activity 类 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  9. java代理的学习,通过类实现接口来实现代理。proxy来创建动态类,和InvocationHandler接口的实现,和工作原理。...

    1.java自带的proxy类可以创建动态类,如果一个类实现了一个接口那么久可以为这个类创建代理. 2.代理:就是当用户要调用一个类的方法时,用户可以通过调用代理,代理通过接口调用原来的类的方法,代理 ...

最新文章

  1. 陕西信息计算机学校,陕西计算机信息专业学校
  2. 20155308郝文菲--第三次作业
  3. sqlserver的索引创建
  4. 罗斯蒙特电磁流量计8723说明书_罗斯蒙特8732EM电磁流量计变送器如何接线!
  5. pvbrowser安装教程(Linux)
  6. 公共mysql数据库_公共MySQL的数据库服务器层
  7. 谈谈NiTE 2手部跟踪在彩色图像上的显示
  8. c语言多维数组基础知识,C语言基础第7章多维数组.ppt
  9. Java笔记-使用RabbitMQ的Java接口实现Routing(路由模式)
  10. Table中合并相同内容列+Excel中合并相同内容列。
  11. 机器视觉齿轮质量快速检测
  12. pypi 镜像使用帮助——临时使用镜像网站
  13. SAP报表程序的下载上传
  14. WidsMob ImageConvert for Mac(图片格式转换器)
  15. 【双拼】双拼输入法入门指南
  16. 3656. 心与心的距离
  17. csp php,CSP策略及绕过方法
  18. 软件工程与计算:第3章需求分析 测试
  19. hdu5651xiaoxin juju needs help(大组合数模板)
  20. C语言之strcmp函数和strncmp函数

热门文章

  1. Macnbsp;OSnbsp;Xnbsp;Snownbsp;Leopardnbsp;10.6下载及…
  2. springmvc项目搭建过程中遇到的BUG及其解决方法
  3. 深度学习100例 | 第43天:文本卷积神经网络(TextCNN)新闻文本分类实战
  4. 消防大数据平台建设解决方案
  5. FANUC机器人伺服放大器的标准设置和电缆连接功能说明
  6. 【前端】【vue.js】【参考项目】vue-konva-project
  7. 你所经历过的传销是这样的吗?
  8. linux 预览md文件_微软 Win10 Dev 预览版 20246 发布:来自最新 FE_RELEASE 开发分支 - Windows 10,微软...
  9. c语言数组练习(录入商品价格信息,逆序排列等)
  10. Win7+Visual Basic V6.0精简版安装过程中的问题