2015-11-03 23 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);