hutool包被sonar扫出不安全的,请问有什么包可以代替这个功能的嘛

在项目中会用到cn.hutool.core.bean.BeanUtil 这个类
BeanUtil.setFieldValue() 方法
但是在项目中 扫出sonar不让用这个jar包,
请问有什么类可以作为替换嘛

img

img

可以用 Apache 的BeanUtils org.apache.commons.beanutils.BeanUtils.setProperty(Object bean, String name, Object value);

或者你看下我根据hutool的源码简单改的这个,去掉了一些校验,你看看ok不。

public static void setFieldValue(Object obj, Field field, Object value) throws IllegalAccessException {
        Class<?> fieldType = field.getType();
        if (null != value) {
            if (!fieldType.isAssignableFrom(value.getClass())) {
                Object targetValue = Convert.convert(fieldType, value);
                if (null != targetValue) {
                    value = targetValue;
                }
            }
        } else {
            value = ClassUtil.getDefaultValue(fieldType);
        }

        if (!field.isAccessible()) {
            field.setAccessible(true);
        }
        
        field.set(obj instanceof Class ? null : obj, value);
    }

参考GPT和自己的思路,如果你需要替换 BeanUtil.setFieldValue() 方法的功能,你可以考虑使用 Java 反射机制来实现类似的功能,而不依赖于第三方库。

下面是一个示例代码,可以使用 Java 反射来设置对象的字段值:

import java.lang.reflect.Field;

public class ReflectionUtils {
    public static void setFieldValue(Object object, String fieldName, Object value) throws NoSuchFieldException, IllegalAccessException {
        Field field = object.getClass().getDeclaredField(fieldName);
        field.setAccessible(true);
        field.set(object, value);
    }
}


使用时,可以这样调用:

SomeClass obj = new SomeClass();
ReflectionUtils.setFieldValue(obj, "fieldName", value);

注意,使用反射机制需要谨慎,因为它可能会影响代码的性能和可维护性。同时,也需要注意安全性,确保只有受信任的代码可以访问私有字段。

可以使用org.springframework.beans.BeanUtils.setProperty(Object bean, String name, Object value) 方法代替。

org.apache.commons.beanutils.BeanUtils#setProperty

<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.4</version>
</dependency>

该回答引用GPTᴼᴾᴱᴺᴬᴵ
如果您的项目中不能使用hutool包,可以考虑使用Java原生的反射机制来实现BeanUtil.setFieldValue()方法的功能。

例如,使用Java反射来设置对象的属性值,示例代码如下:

public static void setFieldValue(Object obj, String fieldName, Object fieldValue) throws NoSuchFieldException, IllegalAccessException {
    Field field = obj.getClass().getDeclaredField(fieldName);
    field.setAccessible(true);
    field.set(obj, fieldValue);
}


该方法将传入的对象obj的fieldName属性值设置为fieldValue,通过Java反射机制实现了类似于hutool的setFieldValue()方法的功能。

使用方法如下:

MyObject obj = new MyObject();
setFieldValue(obj, "fieldName", "fieldValue");


其中,"fieldName"为对象的属性名,"fieldValue"为要设置的属性值。

需要注意的是,使用Java反射机制可能会降低程序性能,因此应该尽量避免在循环中频繁调用。

Apache Commons BeanUtils:Apache Commons BeanUtils 是一个用于处理 Java 对象的工具包,其中包含许多有用的方法。BeanUtils 与 Hutool 类似,可以方便地操作 JavaBean 对象,包括设置和获取属性值。您可以使用 BeanUtils 的 org.apache.commons.beanutils.PropertyUtils 类中的 setProperty() 方法来设置属性值。但请注意,与 Hutool 不同,BeanUtils 不支持链式操作,因此您需要在使用 setProperty() 方法时指定完整的属性路径。
Spring Framework:如果您正在使用 Spring Framework,您可以使用其 org.springframework.beans.BeanWrapper 类来访问和设置 JavaBean 的属性。 BeanWrapper 提供了许多有用的方法,例如 getPropertyValue() 和 setPropertyValue(),可用于获取和设置属性值。与 Hutool 和 BeanUtils 类似,您可以使用 BeanWrapper 对象来访问 JavaBean 的属性,而不必手动编写访问器方法。请注意,使用 Spring Framework 可能需要添加许多其他依赖项,因此您需要在项目构建文件中添加所需的库。

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;

public class Example {

    public static void main(String[] args) throws Exception {
        // 创建一个 JavaBean 对象
        Person person = new Person();
        person.setName("Tom");
        person.setAge(20);

        // 使用 BeanUtils 设置属性值
        BeanUtils.setProperty(person, "name", "Jerry");
        BeanUtils.setProperty(person, "age", 25);

        // 使用 PropertyUtils 获取属性值
        String name = (String) PropertyUtils.getProperty(person, "name");
        int age = (Integer) PropertyUtils.getProperty(person, "age");

        System.out.println(name);  // 输出 "Jerry"
        System.out.println(age);   // 输出 "25"
    }

    public static class Person {
        private String name;
        private int age;

        // 省略 getter 和 setter 方法
    }
}