如何基于变量名调用Java中的setter方法

时间:2015-11-03 11:53:37

标签: java

假设我已经定义了这些变量

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中完成?

5 个答案:

答案 0 :(得分:0)

您可以创建一个方法并重复使用它:

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

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

答案 1 :(得分:0)

基于文本名称访问/调用类/方法的唯一方法是通过反射。但是,如果您的POJO符合getter / setter名称的Java bean标准,那么有些库可以隐藏反射实现,例如Apache Commons Beanutils

答案 2 :(得分: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);
}

答案 3 :(得分:0)

您可以在播放器对象上定义泛型方法,并使用反射设置值。

public void setGenericValue(methodName, param) {
   this.getClass().getMethod(methodName, ...
}

此stackoverflow帖子中的示例: How do I invoke a Java method when given the method name as a string?

答案 4 :(得分: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);