java 如何在不使用“setAccesible()”的情况下使用反射调用私有字段

inb24sb2  于 2022-12-21  发布在  Java
关注(0)|答案(1)|浏览(168)

我已经多次遇到这个问题。
问题是:我有一些带有私有字段的类(例如,用户信息是一个Dto):

public class RegisterRequest {
    private String firstName;
    private String lastName;
    private String username;
    private String email;
    private String fieldOfStudy;
    private String password;
}

在搜索了如何读取这些字段的值的社区后(例如,当进行发布请求时),我看到了很多回答,说解决方案是反射。
假设我想检查任何字段是否为空(在另一个类中),那么我的reflection-method将如下所示:

for (Field f : registerRequest.getClass().getDeclaredFields()) {
    try {
        Field field = registerRequest.getClass().getDeclaredField(f.getName());
        field.setAccessible(true);
        Object value = field.get(registerRequest);
        if (value == null) {
            throw new AccountException("Vul alle velden in.");
        }
    }
    catch (NoSuchFieldException | IllegalAccessException e) {
        e.printStackTrace();
    }
}

现在我想知道是否有一种不使用**field. setAccesible(true)**的方法来实现这一点,因为绕过字段的可访问性可能会导致运行时错误。也就是说,我们不应该使用反射来改变字段的可见性。
感谢您抽出宝贵时间!

bkhjykvo

bkhjykvo1#

在包含私有数据的类中执行有效性检查:

public boolean isValidForm() {
    for (Field field : this.getClass().getDeclaredFields()) {
        try {
            if (field.get(this) == null) {
                return false;
            }
        } catch (IllegalAccessException e) {
            throw new AccountException("Something went wrong");
        }
    }
    return true;
}

通过执行以下操作在其他类中使用此函数:

if(!registerRequest.isValidForm) {
   throw new AccountException("...")
}

Geocodezip的制作者

相关问题