向Java类传递大量参数的最佳技术是什么?

向Java类传递大量参数的最佳技术是什么?,java,Java,我有一个非标准的问题 假设我有一个classMyClass,我使用参数列表从命令行执行 [<key> <value>] 谢谢,当提供的参数很少时,将运行时参数传递给java程序很方便。但在有大量参数列表要传递给程序的情况下,情况并非如此。我建议您不要使用命令行参数来提供信息,而应该使用属性文件。对您来说,Properties文件还保存键值对中的数据,这对您的需求更有意义。另外,使用java类从文件中读取值非常方便 如果需要,可以将属性文件名(带有完整路径)作为参数传递给

我有一个非标准的问题

假设我有一个class
MyClass
,我使用参数列表从命令行执行

[<key> <value>]

谢谢,

当提供的参数很少时,将运行时参数传递给java程序很方便。但在有大量参数列表要传递给程序的情况下,情况并非如此。我建议您不要使用命令行参数来提供信息,而应该使用属性文件。对您来说,
Properties
文件还保存键值对中的数据,这对您的需求更有意义。另外,使用java类从文件中读取值非常方便


如果需要,可以将属性文件名(带有完整路径)作为参数传递给java类。

当提供的参数很少时,可以方便地将运行时参数传递给java程序。但在有大量参数列表要传递给程序的情况下,情况并非如此。我建议您不要使用命令行参数来提供信息,而应该使用属性文件。对您来说,
Properties
文件还保存键值对中的数据,这对您的需求更有意义。另外,使用java类从文件中读取值非常方便


如果需要,可以将属性文件名(带有完整路径)作为参数传递给java类。

从参数列表构建映射应该很简单:

Map<String, String> map = new HashMap<>();
for (i=0; i < args.length-1; i+=2) {
     map.put(args[i], args[i+1];
}

从参数列表构建映射应该很简单:

Map<String, String> map = new HashMap<>();
for (i=0; i < args.length-1; i+=2) {
     map.put(args[i], args[i+1];
}

老实说,我只是解析它们并将它们放在地图上。 并在需要时使用常量键从映射中获取值:
private static final String key\u FIRSTKEY=“FIRSTKEY”

因此,我只需编写一个函数
parseArgs
,将所有内容放入一个映射中。 (这可能属于实用程序类)。下面是一个快速示例(无异常处理)


享受吧

老实说,我只需要解析它们并将它们放在地图上。 并在需要时使用常量键从映射中获取值:
private static final String key\u FIRSTKEY=“FIRSTKEY”

因此,我只需编写一个函数
parseArgs
,将所有内容放入一个映射中。 (这可能属于实用程序类)。下面是一个快速示例(无异常处理)



享受吧

已经为这个问题提供了一个很好的解决方案。我建议使用它,因为它已经经过了很好的测试和使用。重新设计库毫无意义。

已经为这个问题提供了一个很好的解决方案。我建议使用它,因为它已经经过了很好的测试和使用。重新创建库毫无意义。

如果您只需要介绍给定的示例,您可能需要创建一个通用的
parse
方法,该方法返回一个带有键/值的
Map
。但是在我需要parse Map来提取值之后,您可能需要一个java getopt替代方法。看,你上一次的编辑澄清了一点。。。使用反射可以为所有类节省编码时间,但是,您是否注意到字段是静态的?我宁愿在获取
字段
实例后添加一个修饰符检查(以验证它是静态的),然后将该字段作为
Field.set(null,args[k])调用因为,在处理
静态成员时,没有类的实例。感谢您的评论,是的,我知道,我可以为此付出代价来切断开发时间。如果您只需要介绍给定的示例,您可能需要创建一个通用的
parse
方法,该方法返回带有键/值的
映射,但在我需要解析映射来提取值之后,您可能需要一个java getopt替代方案。看,你上一次的编辑澄清了一点。。。使用反射可以为所有类节省编码时间,但是,您是否注意到字段是静态的?我宁愿在获取
字段
实例后添加一个修饰符检查(以验证它是静态的),然后将该字段作为
Field.set(null,args[k])调用因为,在处理
静态成员时没有类的实例。感谢您的评论,是的,我知道,我可以支付此费用来切断开发时间,以确保我可以传递
属性
文件,但在我需要使用
ResourceBundle
并提取所有数据之后。这也是额外的任务。我想转到反射方向。@MaximShoustin不是以属性文件的形式保存的资源包,我相信是的。这个链接应该可以帮助您满足您的需要:感谢链接,我有基于参数的自动化核心,总共有大约300-400个java类,我无法更改infra来处理属性,无论如何,感谢您确保我可以传递
属性
文件,但在我需要使用
ResourceBundle
并提取所有数据之后。这也是额外的任务。我想转到反射方向。@MaximShoustin不是以属性文件的形式保存的资源包,我相信是的。这个链接应该可以帮助您满足您的需要:感谢链接,我有基于参数的自动化核心,我总共有300-400个java类,我不能更改infra来处理属性,总之谢谢Hanks,这实际上是我做的,但您的示例表明我走对了谢谢,这实际上就是我所做的,但你们的例子表明我采取了正确的方式
Map<String, String> map = new HashMap<>();
for (i=0; i < args.length-1; i+=2) {
     map.put(args[i], args[i+1];
}
String arg1 = map.get("-key1");
...
  private static Map<String, String> parseArgs(String... pArgs)
  {
    if (pArgs == null) return null;

    Map<String, String> map = new HashMap<String, String>();
    String arg;
    String key;
    String value;
    for (int i = 0, iLength = pArgs.length; i < iLength; i += 2)
    {
      arg = pArgs[i];

      // GET KEY
      if (!arg.startsWith("-")) continue;
      key = arg.substring(1);

      // GET VALUE
      if ((i + 1) >= pArgs.length) break;
      value = pArgs[i + 1];

      // PUT IT IN MAP
      map.put(key, value);
    }
    return (map.isEmpty()) ? null : map;
  }
  private static void mapStaticFields(Map<String, String> pMap, Class pStaticFieldHolder)
          throws NoSuchFieldException
  {
    if (pMap == null) return;
    for (Map.Entry<String, String> entry : pMap.entrySet())
    {
      try
      {
        Field field = pStaticFieldHolder.getDeclaredField(entry.getKey());
        field.setAccessible(true);
        field.set(field, entry.getValue());
      }
      catch (IllegalAccessException iae)
      {
        // impossible
      }
    }
}
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class MainTest
{
  private static String key1;
  private static String key2;
  private static String key3;

  public static void main(String... pArgs)
  {
    try
    {
      Map<String, String> argMap = parseArgs(pArgs);
      mapStaticFields(argMap, MainTest.class);

      System.out.println(key1);
      System.out.println(key2);
      System.out.println(key3);
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }
}
val1
val2
val3