首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >避免重复调用类似字段的java类的set方法

避免重复调用类似字段的java类的set方法
EN

Stack Overflow用户
提问于 2021-06-30 01:16:03
回答 2查看 62关注 0票数 0

我得到了一个类(我不能修改),它有很多String字段,每个字段都有一个set方法。

代码语言:javascript
复制
public class C {
  private String fieldA,
  private String fieldB,
  ...
  public void setFieldA(String s) {
    this.fieldA = s;
  }
  public void setFieldB(String s) {
    this.fieldB = s;
  }
  ...
}

我需要编写代码来创建类的实例,并使用json对象对其进行初始化(该对象将具有某些或所有字段的值)。

json非常简单,看起来像这样:

{"fieldA":"valueA",“fieldB”:“valueB”.}

我知道我可以为每个字段编写类似下面的内容:

代码语言:javascript
复制
if (myJsonObj.containsKey("fieldA"){
    myInstance.setFieldA(myJsonObj.get("fieldA").toString());
}

我想知道是否有更聪明的方法可以做到这一点,因为字段的数量可能高达30个左右。而不是重复上面的代码30次(每个代码之间唯一不同的是上面代码中的"fieldA“)。

谢谢!

EN

Stack Overflow用户

发布于 2021-07-09 03:24:55

感谢Chris Parker。这是我的最终代码,基于他的原始代码。因为该类中有许多String字段,而且将来可能会更改,所以使用reflect可以非常容易地进行更新/更改:我只需要更改String Array。

给定的类如下所示(仅显示字符串字段及其set方法):

代码语言:javascript
复制
public class MyClass {
  private String fieldA,
  private String fieldB,
  ...
  public void setFieldA(String s) {
    this.fieldA = s;
  }
  public void setFieldB(String s) {
    this.fieldB = s;
  }
  ...
}

使用JSONObject输入将这些字符串字段的值设置到C:

代码语言:javascript
复制
public void fillClassStringFields(MyClass c, JSONObject input) {
        String[] names = {"FieldA","FieldB",...};
        Class<MyClass> clazz = MyClass.class;
        Class<?>[] types = {String.class};
        for(int i = 0; i< names.length;i++) {
            String name = names[i].toString();
            String methodName = "set" + name;
            if(input.containsKey(name)) {
                try {
                    Method method = clazz.getDeclaredMethod(methodName, types);
                    method.invoke(c, input.get(name).toString());
                } catch (NoSuchMethodException | SecurityException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            }
        }
    }
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68183060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档