java - 使用 Map 值调用 Java 方法

标签 java dictionary call

我有几个类需要与此类似的包装方法:

class MyClass {
  public MyClass(String arg1, Date arg2, Integer arg3) {
    // Do something with supplied arguments
  }
}

class MyClassWrapper {
  private ArrayList<MyClass> objects = new ArrayList<MyClass>();
  private final String[] names = {"firstparam","secondparam","thirdparam"};
  private final Object[] classes = {String.class,Date.class,Integer.class};

  public void addEntry(Map<String, Object> params) {
    objects.add(new MyClass(
                (String)params.get(names[0]),
                (Date)params.get(names[1]),
                (Integer)params.get(names[2])
                ));
  }

  public ArrayList<MyClass> getEntries() {
    return objects;
  }

  public Object[] getColumnClasses() {
    return classes;
  }

  public String[] getColumnLabels() {
    return names;
  }
}

这些代码用于从外部源读取数据到 HashMap 中,然后调用 addEntry 来调用 MyClass 构造函数。我编写了自己的 ***Wrapper 类,这样我就不需要添加额外的 MyClass 构造函数来直接读取 Map

我的所有 ***Wrapper 类看起来都一样,除了具有不同的 nameclasses 成员以及手写的 addEntry 之外。有没有办法避免手动编写 addEntry 以利用 namesclasses 自动将 map 值传递到 MyClass 构造函数中?

最佳答案

这是适合您的一种解决方案:

第 1 步:

以下是 MyClass.java 与问题中指定的完全相同。

public class MyClass {

private String arg1;
private Date arg2;
private Integer arg3;

public MyClass(String arg1, Date arg2, Integer arg3) {
        this.arg1 = arg1;
        this.arg2 = arg2;
        this.arg3 = arg3;
    }

@Override
public String toString() {
        return "MyClass [arg1=" + arg1 + ", arg2=" + arg2 + ", arg3=" + arg3 + "]";
    }

}

第 2 步:

现在创建包装类MyClassWrapper.java,如下所示:

import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class MyClassWrapper<T> {
    private List<T> objects = new ArrayList<T>();
    private String[] names;
    private Class<?>[] classes;
    private Class<T> clazz;

    public MyClassWrapper(Class<T> clazz, String[] names, Class<?>[] classes) throws Exception {
        this.clazz = clazz;
        this.names = names;
        this.classes = classes;
    }

    public void addEntry(Map<String, Object> params) throws Exception {
        Constructor<T> constructor = clazz.getConstructor(classes);
        Object[] parameters = new Object[names.length];
        for (int i = 0; i < names.length; i++) {
            parameters[i] = params.get(names[i]);
        }
        objects.add(constructor.newInstance(parameters));
    }

    public List<T> getEntries() {
        return objects;
    }

    public Class<?>[] getColumnClasses() {
        return classes;
    }

    public String[] getColumnLabels() {
        return names;
    }
}

第 3 步:

现在,MyClassWrapperDemo 类将使用参数 MyClass 来测试 MyClassWrapper。但是您可以将 MyClassWrapper 与其他看起来类似于 MyClass 的类一起使用。您不需要定义另一个版本的包装类。

import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MyClassWrapperDemo {
    public static void main(String[] args) throws Exception {
        MyClassWrapper<MyClass> wrapper=
                new MyClassWrapper<MyClass>(
                MyClass.class, 
                new String[]{"firstparam", "secondparam", "thirdparam" },
                new Class<?>[]{String.class, Date.class, Integer.class}
                );     
        Map<String, Object> params =new HashMap<String, Object>();
        params.put("firstparam", "HelloWorld");
        params.put("secondparam", new Date());
        params.put("thirdparam", 30);
        wrapper.addEntry(params);
        List<MyClass> list= wrapper.getEntries();
        String[] lebels = wrapper.getColumnLabels();
        Class<?>[]  objects= wrapper.getColumnClasses();
        System.out.println(list);
        System.out.println(Arrays.toString(lebels));
        System.out.println(Arrays.toString(objects));

    }

}

关于java - 使用 Map 值调用 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38298886/

相关文章:

java - 为给定的一组路点或一条线绘制多边形?

java - 简单的 JOptionPane.showMessage();

iOS:处理多维 Plist

python - 提取Python字典中计数为0的元素

c++ - 使用内联汇编程序从 GCC 中的共享库调用函数

python - 函数调用python中的表达式吗?

java - GWT:如何在 RPC 中检索和修改 HttpServeletResponse?

java - Leetcode 数字根

python - 获取字符串中出现次数最多的第一个字母

javascript - 在 setTimeout 和函数内部调用函数