使用 BeanUtils 检索字段值

发布于 2024-11-09 14:26:12 字数 57 浏览 2 评论 0 原文

我想提取未由某些自定义注释标记的私有字段值,这可以通过 BeanUtils 实现吗?如果是,怎么办?

I want to extract private field values that are not marked by certain custom annotation, is this possible via BeanUtils? If yes, how?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

冰葑 2024-11-16 14:26:12

是的,假设您知道字段名称。您可以使用 PropertyUtils.getSimpleProperty(...)。另请参阅此处举个例子。

Yes, assuming that you know the fields names. You can use PropertyUtils.getSimpleProperty(...). See also here for an example.

错々过的事 2024-11-16 14:26:12

不,BeanUtils 不可能做到这一点。但是您可以使用 Java 自己的反射工具,如下所示:

public class BeanUtilTest {
    public static void main(String[] args) throws ... {
        MyBean bean = new MyBean();

        Field field = bean.getClass().getDeclaredField("bar");
        field.setAccessible(true);
        System.out.println(field.get(bean));
    }

    public static class MyBean {
        private final String bar = "foo";
    }
}

请考虑:使用反射访问私有字段是非常糟糕的方式,并且仅应在测试或确定没有其他方法时才这样做。如果您无法更改您尝试访问的类的源,这可能是最后的手段。但请考虑到该行为将来可能会发生变化(例如,作为您正在使用的库的更新)并破坏您的代码。

编辑:如果 BeanUtils 或 PropertyUtils 正在工作,这意味着该属性有一个公共 getter,您应该使用它而不是使用反射。在没有公共 getter 的情况下在私有字段上使用 PropertyUtils 会引发 NoSuchMethodException。

No, it is not possible with BeanUtils. But you can use Java's own reflection tools like this:

public class BeanUtilTest {
    public static void main(String[] args) throws ... {
        MyBean bean = new MyBean();

        Field field = bean.getClass().getDeclaredField("bar");
        field.setAccessible(true);
        System.out.println(field.get(bean));
    }

    public static class MyBean {
        private final String bar = "foo";
    }
}

Please consider: Accessing private fields with reflection is very bad style and should be done only for tests or if you are sure there is no other way. If you don't have the ability to change the sources of the class you're trying to access, it might be a last resort. But consider that the behavior might change in the future (e.g. as an update of the library you're using) and break your code.

Edit: If BeanUtils or PropertyUtils are working, this means there is a public getter for this property and you should be using it instead of using reflection. Using PropertyUtils on a private field without a public getter throws a NoSuchMethodException.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文