java - 使用 this.getClass().getDeclaredField 方法时出现 NullPointerException

标签 java reflection

我只想获取 POJO 的一个字段名称,我的 java POJO 如下所示:

public class A1 {

        private String field2;
    private String field1;
    public String getField2() {
        return field2;
    }
    public void setField2(String field2) {
        this.field2 = field2;
    }
    public String getField1() {
        return field1;
    }
    public void setField1(String field1) {
        this.field1 = field1;
    }
    @Override
    public String toString() {
        return "A1 [field2=" + field2 + ", field1=" + field1 + "]";
    }

        public String getFiled1Name() throws NoSuchFieldException, SecurityException{
            return this.getClass().getDeclaredField(field1).getName();
        }

    }

在客户端代码中:

System.out.println(new A1().getFiled1Name());

我收到NullPointerException

我尝试了方法 this.getClass().getDeclaredFields() ,这按预期工作。但问题是:它返回所有字段(java.lang.reflect.Field),我需要迭代、比较,然后返回正确的字段名。

相反,我只想获取一个字段名称,并且方法中没有硬编码的字段名称。我怎样才能得到这个?

最佳答案

您应该提供字段的名称而不是字段本身,因为 field1 是 String,它是 null 并且您将 null 传递给 getDeclaredField,

public String getFiled1Name() throws NoSuchFieldException, SecurityException {
    return getClass().getDeclaredField("field1").getName();
}

Class#getDeclareField throws NullPointerException - if name is null

<小时/>

I don't want to hard code "field1"

您可以为字段名称创建一个常量,而不是使用反射,但对于名称的每次更改,您还需要更新常量。

以其他方式,您可以获取所有声明的字段并从数组中访问字段的名称。但使用它时要小心,因为声明中的更改可能会改变方法的行为。

public String getFiled1Name() throws NoSuchFieldException, SecurityException {
    return getClass().getDeclaredFields()[0].getName();
}

关于java - 使用 this.getClass().getDeclaredField 方法时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38887744/

相关文章:

Java对子类的静态反射

java - 如何连接远程MySQL数据库?

java - 使用 Stax 在 XML 文件中搜索特定字符串

java - "Closing"阻塞队列

java - 元素应该是 "select",但却是 "input"我该如何解决此错误

java - 当无法泛化时,正确转换为作为参数传递的未知类型

reflection - Kotlin 反射 - 检查属性是否具有类型

java - 将行数据读取到字符串数组中?

java.lang.ClassNotFoundException : SavingAccount 异常

validation - 在 Kotlin 中,根据属性的类型限制注解目标