【问题标题】:How To Populate A JavaBean Other Than Using Reflection除了使用反射之外,如何填充 JavaBean
【发布时间】:2011-04-03 12:47:01
【问题描述】:

你知道我是否可以填充 javabean 但我不想使用反射。

例如我有这个 xml 模板来填充它

示例 XML 文件

<property name = "card" value = "cdd"/>

public class Customer {
    private String card;

     public void setCard(String card) {
          this.card = card;
     }

     public String getCard() {
     }

}

我想在 Java bean 上调用 setCard 但我不想使用反射 因为我以前用过,而且速度很慢,

还有其他选择吗?例如,Hibernate 是如何做到的?

谢谢 卡罗

【问题讨论】:

  • hibernate 使用反射。与解析 xml 文件相比,反射所花费的时间非常少。

标签: java reflection javabeans java-bytecode-asm


【解决方案1】:

从 XML 填充 JavaBean 的唯一更快的方法(即比使用反射更快)是编写或生成一些绑定代码,这些代码使用从 XML 中提取的值(在本例中是从 XML 属性)调用设置器。

  • 手工编写绑定代码是最简单的方法……前提是您无需编写太多代码。

  • 代码可以作为源代码生成并编译。

  • 可以使用 BCEL 或 ASM 等字节码生成技术生成代码。

  • 可能有一些现有的 XML-to-JavaBean 绑定生成器,尽管现有绑定很可能使用反射而不是代码生成。


但是,尚不清楚这是否值得费心避免反思。虽然反射相对昂贵,但 XML 可能要贵得多。我建议您在决定使用更复杂的实现方法之前进行一些分析。

【讨论】:

  • 我将添加 Apache BeanUtils 作为一个可行的选项。
  • @David - BeanUtils 使用反射。
【解决方案2】:

我很确定 Hibernate 在底层使用了反射 API。 Groovy 还为自动生成和使用 bean getter/setter 提供了一些很好的支持,它们最终也使用了底层反射。

现在有一个选项,您可以对解析器进行硬编码以读取 xml 并在给定 name 属性的情况下调用适当的 setter,但是您会遇到解析器变得脆弱的问题(如果有意义的话,当您的模型发生更改时) .

【讨论】:

  • 哦,我不知道hibernate使用反射,我以为他们一直在使用代码生成......
【解决方案3】:

如果 Bean 是你的,你可以实现这样的接口:

/** Tries to set the property named key with the value given and returns true for success or false otherwise. */
boolean set(String key, Object value);

然后简单地转换到该接口并尝试使用该方法来设置属性。它确实需要在 bean 中进行一些工作 - 但要避免反射。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    相关资源
    最近更新 更多