【JAVA】反射获取对象/LIST中对象属性

简介: 【JAVA】反射获取对象/LIST中对象属性

背景


照着这篇文章Springboot敏感字段脱敏敲了一下例子,然后有一些需要注意的地方,这里记录一下。


代码


首先是需要引入的依赖项,如下:


  implementation 'org.assertj:assertj-core:3.21.0'
  implementation 'org.springframework:spring-aspects:5.3.13'
  implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4'
  implementation 'com.alibaba:fastjson:1.2.78'
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.0'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
  implementation 'org.springframework:spring-aop:5.3.14'


配置文件里还需要配置一下:


jasypt.encryptor.password: 71144850f4fb4cc55fc0ee6935badddf


然后其他代码看原博客就可以。


改进


这里主要写一下,改动了的地方,也就是EncryptHandler的handler方法,因为这个handler方法这能处理参数或者返回值为具体对象,也就是UserVo的情况,处理不了List<UserVo>的情况,下面直接上上代码:


private Object handler(Object obj, EncryptConstant type) throws IllegalAccessException {
        if (Objects.isNull(obj)) {
            return null;
        }
        //判断是否是list
        Class cls2 = obj.getClass();
        if (cls2.isAssignableFrom(ArrayList.class)
                ||cls2.isAssignableFrom(List.class)
                ||cls2.isAssignableFrom(LinkedList.class)){
            List<Object> list= (List<Object>) obj;
            list.forEach(object->{
                try {
                    processObj(object,type);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            });
        }else {
            processObj(obj,type);
        }
        return obj;
    }
    private void processObj(Object obj, EncryptConstant type)  throws IllegalAccessException {
        Field[] fields = obj.getClass().getDeclaredFields();
        for (Field field : fields) {
            boolean hasSecureField = field.isAnnotationPresent(EncryptField.class);
            if (hasSecureField) {
                field.setAccessible(true);
                String realValue = (String) field.get(obj);
                String value;
                if (DECRYPT.equals(type)) {
                    value = stringEncryptor.decrypt(realValue);
                } else {
                    value = stringEncryptor.encrypt(realValue);
                }
                field.set(obj, value);
            }
        }
    }
目录
相关文章
|
20天前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
23天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
43 17
|
23天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
26天前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
53 5
|
24天前
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
18 3
|
24天前
|
Java 程序员
Java|List.subList 踩坑小记
不应该仅凭印象和猜测,就开始使用一个方法,至少花一分钟认真读完它的官方注释文档。
21 1
|
25天前
|
存储 Java
[Java]反射
本文详细介绍了Java反射机制的基本概念、使用方法及其注意事项。首先解释了反射的定义和类加载过程,接着通过具体示例展示了如何使用反射获取和操作类的构造方法、方法和变量。文章还讨论了反射在类加载、内部类、父类成员访问等方面的特殊行为,并提供了通过反射跳过泛型检查的示例。最后,简要介绍了字面量和符号引用的概念。全文旨在帮助读者深入理解反射机制及其应用场景。
16 0
[Java]反射
|
1月前
|
存储 Java 数据管理
Java零基础-Java对象详解
【10月更文挑战第7天】Java零基础教学篇,手把手实践教学!
25 6
|
23天前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
22 0
|
5月前
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
915 1