首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

回答 2

Stack Overflow用户

发布于 2021-06-30 02:44:06

对我来说,这是一份需要反思的工作。除了标记有“反射”的部分之外,这里的所有内容都是为了使其成为SSCCE。您可能会有自己的方法来跟踪可用的方法或其他方法。看看下面的网站(IMHO)一个很好的指南(我与这个网站没有任何关系):Guide to Java Reflection

代码语言:javascript
复制
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test {

    private String fieldA;
    private String fieldB;
    private String fieldC;
    private String fieldD;
    private String fieldE;
    public String getFieldA() {
        return fieldA;
    }
    public void setFieldA(final String fieldA) {
        this.fieldA = fieldA;
    }
    public String getFieldB() {
        return fieldB;
    }
    public void setFieldB(final String fieldB) {
        this.fieldB = fieldB;
    }
    public String getFieldC() {
        return fieldC;
    }
    public void setFieldC(final String fieldC) {
        this.fieldC = fieldC;
    }
    public String getFieldD() {
        return fieldD;
    }
    public void setFieldD(final String fieldD) {
        this.fieldD = fieldD;
    }
    public String getFieldE() {
        return fieldE;
    }
    public void setFieldE(final String fieldE) {
        this.fieldE = fieldE;
    }

    private static final char[] chars = {'A', 'B', 'C', 'D', 'E'};
    private static final String[] values =
        {"valueA", "valueB", "valueC", "valueD", "valueE"};
    private static final Class<?>[] types = {String.class};




    public static void main(final String[] args)
        throws SecurityException, NoSuchMethodException, IllegalArgumentException,
        IllegalAccessException, InvocationTargetException {

        // Reflection setting values - everything else is here solely to make this an SSCCE
        final Test test = new Test();
        final Class<Test> clazz = Test.class;
        for(int i = 0; i < chars.length; i++) {
            final String name = "setField" + chars[i];
            final Method method = clazz.getDeclaredMethod(name, types);
            final Object[] params = {values[i]};
            method.invoke(test, params);
        }
        // End of reflection


        System.out.println(test.getFieldA());
        System.out.println(test.getFieldB());
        System.out.println(test.getFieldC());
        System.out.println(test.getFieldD());
        System.out.println(test.getFieldE());
    }
}
票数 1
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
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68183060

复制
相关文章

相似问题

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