2011-04-03 25 views
0

你知不知道是否有無論如何,我可以填充一個JavaBean,但我不希望使用反射。如何填充一個JavaBean除了使用反射

比如我有這樣的XML模板pouplate它

示例XML文件

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

public class Customer { 
    private String card; 

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

    public String getCard() { 
    } 

} 

我想打電話給setCard上的Java bean,但我不希望因爲我使用反射 已經使用過它,它是相當緩慢的,

有什麼辦法? Hibernate如何做到這一點?

感謝 卡羅

+2

休眠使用反射。與解析xml文件相比,反射需要的時間無限小。 – MeBigFatGuy 2011-04-03 12:53:38

回答

1

從XML填充JavaBean的唯一更快的方法(即比使用反射更快)是編寫或生成一些綁定代碼,該代碼使用從XML中提取的值調用setters(在本例中爲XML屬性) 。

  • 手寫綁定代碼是最簡單的方法......只要你沒有太多的寫。

  • 代碼可以作爲源代碼來生成和編譯。

  • 可以使用字節碼生成技術(如BCEL或ASM)生成代碼。

  • 可能有一些現有的XML到的JavaBean結合發生器,雖然現有的綁定可能使用反射,而不是代碼的生成。


但是,目前尚不清楚這是值得去費心避免反射。雖然反射比較昂貴,但XML可能要昂貴得多。在決定使用更復雜的實現方法之前,我建議先進行一些分析。

+0

我將添加Apache BeanUtils作爲一個可行的選項。 – 2011-04-03 14:17:10

+1

@David - BeanUtils使用反射。 – 2011-04-03 14:34:55

0

我敢肯定,Hibernate使用反射API的上深下罩。 Groovy還具有用於自動生成和使用豆getter/setter方法也最終使用反射罩下以及一些很好的支撐。

現在有一個選項,你可以硬編碼你的解析器來讀取xml,並在給定name屬性的情況下調用適當的setter,但是你遇到了解析器變得脆弱的問題(當你的模型改變時)。

+0

哦,我不知道hibernate使用反射,我以爲他們一直在使用代碼生成... – grassbl8d 2011-04-03 13:00:04

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); 

然後只需到該接口,並嘗試使用該方法來設置屬性。這確實需要一些豆的工作 - 但避免反思。