如何使用反射填充JavaBean

时间:2011-04-03 12:47:01

标签: java reflection javabeans java-bytecode-asm

你知道我是否可以填充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如何做到这一点?

由于 卡罗

3 个答案:

答案 0 :(得分:1)

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

  • 手写代码是最简单的方法......只要你没有太多东西可以写。

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

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

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


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

答案 1 :(得分:0)

我非常确定Hibernate深入使用了反射API。 Groovy也有一些很好的支持,可以自动生成和使用bean getter / setter,它们最终也会在引擎盖下使用反射。

现在有一个选项可以让你的解析器硬编码来读取xml,并在给定name属性的情况下调用相应的setter,但是你会遇到解析器变脆的问题(当你的模型改变时,如果这是有意义的话)

答案 2 :(得分:0)

如果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中做一些工作 - 但要避免反思。