大家好,我是鱼尾~,本期带大家了解java的反射机制,以及我所使用到的业务场景

反射是框架设计的灵魂
(使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)

反射的概述

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

业务场景

在数据库设计中,在表的设计上,通常会有一些基础、常用的字段,例如createBy(创建人),update(修改人)等等,在数据库当中存储数据一般是使用userId去存储来代表一个用户,如图:

但是,在某些业务场景下,前端需要展示这些信息,我们直接查出来返回,前端看到的就是这一串数字,不是很友好。

当然也可以使用代码的方式根据userId去查询出来userName,然后在一个个set值,最后进行返回,这种方式也是可以解决问题的,但是如果是一个大型项目或系统呢,有非常多表,这类型字段也很多,手动去转,代码量必然会很大且浪费许多精力、时间,

针对此情况,我们就可以使用java的反射机制,通过自定义一个注解,在这些字段上面加上这个注解
然后返回给前端的信息就可以通过反射机制,转换成真实的姓名。

首先,先自定义一个注解:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Person {}

然后在写一个工具类:

public void personCover(Object ...objs) {for (int i = 0; i < objs.length; i++) {Object obj = objs[i];final List<SysUser> sysUserList = interSysUserService.selectList();boolean isCollection = Collection.class.isAssignableFrom(obj.getClass());// 如果是集合if (isCollection) {List<Object> objList = (List<Object>) obj;objList.forEach(o -> {try {cover(o, sysUserList);} catch (Exception e) {e.printStackTrace();}});} else {cover(obj, sysUserList);}}}public void cover(Object obj, List<SysUser> sysUserList) {try {final Field[] declaredFields = obj.getClass().getDeclaredFields();for (Field f : declaredFields) {final boolean annotationPresent = f.isAnnotationPresent(Person.class);if (annotationPresent) {f.setAccessible(true);final Object o = f.get(obj);for (SysUser sysUser : sysUserList) {if (sysUser.getUserId().equalsIgnoreCase(String.valueOf(o))) {f.set(obj, sysUser.getUserName());break;}}}}} catch (Exception e) {log.error("人员名称转换异常:" + e.getMessage(), e);throw new RuntimeException(e);}}

然后在需要做转换的字段上面加上刚刚自定义的注解:

然后在业务代码中注入刚刚写的工具类,括号中为查询出来的需要返回给前端的Vo信息(可以传多个)

personUtil.personCover(XXXVo);

到此,人员转换的自定义注解就完成了,前端看到的信息就是真实的名字,而不是一串谁都不认识的数字了。


以上就是本期分享,我是鱼尾~,有帮助的话就动动小手点个 赞 吧~

java 通过反射将userId转userName相关推荐

  1. java的反射技术_Java学习——反射技术

    1. 反射机制介绍_Class对象获取 (1) 什么是(Reflection)反射?其它语言有这种特点吗? 答:动态语言:在程序运行时,可以改变程序的结构或变量的类型.典型的动态语言"Pyt ...

  2. Java中反射的三种常用方式

    Java中反射的三种常用方式 package com.xiaohao.test; public class Test{ public static void main(String[] args) t ...

  3. java反射机制(三)---java的反射和代理实现IOC模式 模拟spring

    IOC(Inverse of Control)可翻译为"控制反转",但大多数人都习惯将它称为"依赖注入".在Spring中,通过IOC可以将实现类.参数信息等配 ...

  4. 【Java】反射( reflection)机制 详解

    目录 1. 定义 2. 用途(了解即可) 3. 反射的基本信息 4. 反射相关的类(重要) 4.1 Class类(反射机制的起源 ) 4.2 Class类中的相关方法(方法的使用方法在后边的示例当中) ...

  5. java 泛型反射_Java使用反射来获取泛型信息示例

    本文实例讲述了Java使用反射来获取泛型信息.分享给大家供大家参考,具体如下: 一 点睛 获得了Field对象后,就可以很容易地获得该Field的数据类型,即使用如下代码即可获得指定Field的类型: ...

  6. java初反射_初始 java 反射机制 (一)

    反射机制详解 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为j ...

  7. Java的反射机制 工厂模式综合讲解【转载自51CTO】

    2019独角兽企业重金招聘Python工程师标准>>> Java的反射机制 工厂模式综合讲解 1.什么叫反射 Java.lang.reflect包下 正常情况下我们可以通过类实例化一 ...

  8. [Java基础] 反射机制汇总

    引言 初学Java反射机制的时候,只是感觉很神奇,但是不知道学了该怎么用,所以过了一段时间就忘得差不多了:最近接触到了框架,在学习中遇到了反射,深深体会到了反射机制的神奇,回来复习了一下反射机制,写一 ...

  9. Java 利用反射实现C#的委托

    一, 观察者模式的缺点 在之前的博文的介绍过观察者模式了. 观察者模式可以让多个观察者同时观察1个被观察者. 也就说被观察者可以1次过执行所有观察者的update()方法. 再通俗d来讲, 就是多个观 ...

最新文章

  1. OSSIM平台安全事件关联分析实践
  2. 网络上一个人也是孤独地.
  3. 推荐一款Python开源库,技术人必备的造数据神器!
  4. 为什么按照 Angular 官网教程执行简单的测试代码,会遇到expect is not defined的错误消息
  5. .NET下,你采用的哪种方式来操作数据库
  6. Nginx 设置文件缓存时间
  7. inDesign教程,如何创建风格化的书籍封面?
  8. C语言的32个关键字怎么背,C语言32个关键字,精心整理带中文翻译
  9. 北京计算机学校招生要求,北京小升初 16区采取电脑随机录取的入学途径及规则 2021家长一定要看...
  10. NetBeans简介和简单使用
  11. 【熟知水星无线路由器的安装步骤】
  12. python取绝对值数组_Python算法——求数组中绝对值最小的数
  13. ProtoBuf(Google Protocol Buffers)—— repeated 修饰字段注意点(packed修饰)
  14. Linux中解除带锁的文件夹
  15. 荣耀猎人游戏本散热怎么样?测试一下就知道
  16. android_10.0.0_r41自定义驱动编译+Framework层调用_2(自定义驱动)
  17. 【AI实战】手把手教你深度学习文字识别(文字检测篇:基于MSER, CTPN, SegLink, EAST等方法)...
  18. DSP与DAC数字音频接口时钟分析
  19. 小桥加加的英语学习博客
  20. k8s之存储抽象nfs挂载

热门文章

  1. p20华为云电脑白屏_华为云电脑让P20如虎添翼,连接键鼠秒变办公利器
  2. Kali Linux下命令行终端的中英文切换
  3. SpringBoot漏洞复现
  4. 前端利器CodePen,了解一下吧
  5. wampserver mysql忘记密码_WampServer修改MySQL密码
  6. IC公司认可的数字IC_FPGA设计课程
  7. springboot+shardingsphere温故而知新
  8. QT 此操作至少需要一个处于启用状态的有效资料档案库
  9. AI/计算机志愿填报指南发布!最受关注的终极八问,参考答案在此
  10. uniapp开发APP实现导航栏顶部搜索功能