2015-11-03 54 views
0

比方說,我已經定義了這些變量如何調用基於變量名的Java setter方法

RDFNode bd= soln.get(SparqlConstants.BD) ; 
RDFNode alias = soln.get(SparqlConstants.ALIAS) ; 
RDFNode thumbnail = soln.get(SparqlConstants.THUMBNAIL) ; 
RDFNode battingSide = soln.get(SparqlConstants.BATTING_SIDE) ; 

然後爲他們每個人,我有一個值設置在這樣的setter方法

if (bd!= null) 
    player.setBirthDate(bd.asNode().getIndexingValue().toString()); 

有沒有辦法有一個通用的方法,即我傳遞價值,並因此一般,這可能在Java中進行調用的方法?

回答

0

您可以創建一個方法,並重新使用它:

public String getIndexingValue(RDFNode node) 
{ 
    return node.asNode().getIndexingValue().toString(); 
} 

if(bd != null) 
    player.setBirthDate(getIndexingValue(bd)); 
... and so on ... 
+0

如果我理解正確的話, OP想要更換setter'setBirthDate()',而不是getter –

+0

@sharo NBB但我沒有在任何地方使用getter,我只提到了setter。 – Abubakkar

+0

你創建了一個新的'getIndexingValue()'getter而不是解決顯式調用'setBirthDate()'' –

0

只有這樣,才能訪問/調用基於文本名稱的類/方法是通過反射。但是,如果您的POJO遵守getter/setter名稱的Java bean標準,則會有一些庫(如Apache Commons Beanutils)可以隱藏反射實現。

0

隨着reflection你可以這樣做:

public void set(RDFNode node, String propertyName) { 

    String methodName = "set" + propertyName; // <-- propertyName must be in upper CamelCase 

    String value = node.asNode().getIndexingValue().toString(); 

    Method setMethod = player.getClass().getMethod(methodName, String.class); 
    setMethod.invoke(player, value); 
} 
+1

'String methodName =「set」+ propertyName;'即使名字是駱駝大小寫也不行 - 你必須大寫名字。但是Apache bean utils會照顧到這一點 –

0

您可以使用的方法 -

private void setBirthDate(Player player, RDFNode obj) { 
     if (obj != null) { 
       player.setBirthDate(obj.asNode().getIndexingValue().toString()); 
     } 
    } 

然後調用它喜歡 -

RDFNode bd= soln.get(SparqlConstants.BD); 
setBirthDate(player, bd);