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