【问题标题】:getDeclaredField(String) vs. getMethod(String) for private fields in a beanbean 中私有字段的 getDeclaredField(String) 与 getMethod(String)
【发布时间】:2011-04-07 22:36:05
【问题描述】:

我有一个 bean,我想通过反射访问它的属性。我收到字符串形式的属性名称。 bean 具有用于其私有字段的 getter 方法。

我目前正在使用getDeclaredField(fieldName) 获取该字段,通过使用setAccessible(true) 使其可访问,然后使用get 检索其值。

另一种方法是将字段名称大写并在其前面添加get,然后从类中获取该名称的方法,最后调用该方法以获取私有值字段。

哪种方式更好?

编辑

也许我应该解释一下我所说的“更好”是什么意思……“更好”是指最佳实践。或者,如果有任何细微的警告或差异。

【问题讨论】:

    标签: java reflection getmethod


    【解决方案1】:

    这取决于您的用途,但总的来说,我更喜欢使用 getter,因为这是“正常”的方式,并且在更多情况下会做类开发人员期望完成的事情。

    原则上,如果类的开发者已将字段设为私有,他可以随意做他想做的事,例如,如果可以用其他方式计算,稍后将其删除。如果 3 个月后你不走运,当没人记得了时,字段访问将立即中断。

    请注意,有一个像 apache commons BeanUtils 之类的库(我相信 Spring 中也有一个),它可以为您做到这一点并提供更健全的接口,例如哈希映射。

    【讨论】:

    • 感谢您提及BeanUtils。我不知道。我的下一个问题是是否有图书馆这样做。我不想重新发明轮子。 :)
    • 接受这个答案,因为它直接回答了我原来的问题。
    【解决方案2】:

    在什么方面更好?

    您可以编写一个 20 行的单元测试,看看哪个更快。您可以同时编写并查看它们,看看哪个更容易阅读。如果一种方法既容易阅读又更快,那就去吧。如果没有,你将不得不选择你的毒药......

    【讨论】:

      【解决方案3】:

      可能使用 getter 方法,因为它可能除了返回属性值之外还有其他行为。但是,这取决于班级。

      【讨论】:

        【解决方案4】:

        您可能想看看Introspector 类,如果您只想处理已公开的属性,它是一个很好的包装器,您可以获取BeanInfo 对象,然后调用getPropertyDescriptors(),用于示例:

        final BeanInfo info = Introspector.getBeanInfo(clazz);
        for (PropertyDescriptor prop : info.getPropertyDescriptors()) {
            final Method read = prop.getReadMethod();
            if (read != null) {
                // do something
            }
        }
        

        【讨论】:

        • 谢谢!正是我想要的。
        猜你喜欢
        • 2010-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-12
        • 2013-11-15
        相关资源
        最近更新 更多