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

如何在Java中基于变量名调用setter方法,java,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

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

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中进行泛型调用?

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

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

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

基于文本名称访问/调用类/方法的唯一方法是通过反射。但是,如果您的POJO遵循getter/setter名称的JavaBean标准,则存在一些库,例如可以隐藏反射实现的库。

使用
反射
可以执行以下操作:

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);
}
public void集(RDFNode节点,String propertyName){

String methodName=“set”+propertyName;//您可以在播放器对象上定义一个通用方法,并使用反射设置值

public void setGenericValue(methodName, param) {
   this.getClass().getMethod(methodName, ...
}
此stackoverflow post中的示例:

您可以使用以下方法-

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

如果我理解正确,OP希望替换setter
setBirthDate()
,而不是getter@sharonbn但是我没有在任何地方使用getter,我只提到了setter。您创建了一个新的
getIndexingValue()
getter,而不是显式调用setter
setBirthDate()
String methodName=“set”+propertyName;
即使名称是驼峰大小写也不起作用-您必须将名称大写。但是Apache bean utils会解决这个问题