用于对象初始化的Java CLI参数语法

用于对象初始化的Java CLI参数语法,java,parsing,properties,posix,command-line-arguments,Java,Parsing,Properties,Posix,Command Line Arguments,我正在寻找一个工具,它允许我使用命令行样式,最好是POSIX字符串来初始化对象的属性 例如,您可以为其提供如下格式的字符串输入: String input = "--firstName=John --MiddleName=\"Louis Victor\" --lastName=Smith"; 。。。它将在给定的对象上设置FirstNameJohn、setMiddleNameLouis Victor和setLastNameSmith。可能是JavaBean 请注意,输入是单个字符串,而不是像许多

我正在寻找一个工具,它允许我使用命令行样式,最好是POSIX字符串来初始化对象的属性

例如,您可以为其提供如下格式的字符串输入:

String input = "--firstName=John --MiddleName=\"Louis Victor\" --lastName=Smith";
。。。它将在给定的对象上设置FirstNameJohn、setMiddleNameLouis Victor和setLastNameSmith。可能是JavaBean

请注意,输入是单个字符串,而不是像许多流行的CLI参数解析器那样的数组字符串[]

这一切都很相似,但我无法让它工作。。。我希望避免使用@annotation


是否有人拥有可以实现这一点的代码/库/工具?

对于您的用例,忘记常规CLI解析器吧,您需要定制的解决方案。如果您真的有这样一个简单的参数,语法参数总是以-,而不是在参数值中出现-,那么您可以使用类似此类的简单解决方案:

解析字符串参数 输出

{firstName=John,middleName=Louis Victor,lastName=Smith}

现在,您可以将地图与commons beanutils之类的Bean库一起使用。我个人更喜欢Spring BeanRapper,但这只有在使用Spring时才有意义

定义Bean类 无论如何,我将使用这个值持有者类:

public class Name{

    private String firstName;
    private String middleName;
    private String lastName;

    @Override
    public String toString(){
        return Objects
            .toStringHelper(this)
            .add("first name", firstName)
            .add("middle name", middleName)
            .add("last name", lastName)
            .toString();
    }

    // + getters & setters

}
设置Bean属性 现在我们将使用应用参数值,如下所示:

final String input =
    "--firstName=John --middleName=\"Louis Victor\" --lastName=Smith";
final Map<String, String> paramValues =
    new ArgParser().getParamValues(input);
final Name name = new Name();
BeanUtils.populate(name, paramValues);
System.out.println(name);
final Name name = new Name();
final BeanWrapper wrapper = new BeanWrapperImpl(name);
wrapper.setPropertyValues(paramValues);
参考:


对于您的用例,忘记常规CLI解析器,您需要定制的解决方案。如果您真的有这样一个简单的参数,语法参数总是以-,而不是在参数值中出现-,那么您可以使用类似此类的简单解决方案:

解析字符串参数 输出

{firstName=John,middleName=Louis Victor,lastName=Smith}

现在,您可以将地图与commons beanutils之类的Bean库一起使用。我个人更喜欢Spring BeanRapper,但这只有在使用Spring时才有意义

定义Bean类 无论如何,我将使用这个值持有者类:

public class Name{

    private String firstName;
    private String middleName;
    private String lastName;

    @Override
    public String toString(){
        return Objects
            .toStringHelper(this)
            .add("first name", firstName)
            .add("middle name", middleName)
            .add("last name", lastName)
            .toString();
    }

    // + getters & setters

}
设置Bean属性 现在我们将使用应用参数值,如下所示:

final String input =
    "--firstName=John --middleName=\"Louis Victor\" --lastName=Smith";
final Map<String, String> paramValues =
    new ArgParser().getParamValues(input);
final Name name = new Name();
BeanUtils.populate(name, paramValues);
System.out.println(name);
final Name name = new Name();
final BeanWrapper wrapper = new BeanWrapperImpl(name);
wrapper.setPropertyValues(paramValues);
参考:


如果我理解正确,您正在寻找一个Java库来解析POSIX风格的命令行参数。我不久前使用过,当时使用XML配置非常酷。

如果我理解正确,您正在寻找一个Java库来解析POSIX风格的命令行参数。不久前我用过,当时使用XML配置真的很酷。

-firstName John -lastName Smith
你是说没有POSIX

--firstName John --lastName Smith
这可能就是你不能让它工作的原因

更新: 当我看这个例子时,它看起来不可能是原因。

-firstName John -lastName Smith
你是说没有POSIX

--firstName John --lastName Smith
这可能就是你不能让它工作的原因

更新:
当我看这个例子时,它看起来不可能是原因。

我正在尝试,但据我所知,我需要添加选项。。。对于每个对象的每个属性,否则我将抛出一个UnrecognedDoptionException。我需要它更一般化。您可以使用反射来查询类和填充选项对象。@LeguRi添加了一个不同的实现!最后,我将JSAP与BeanUtils一起使用,因此我将接受@Tomasz Nerkiewicz的answr,但赏金是你的!我正在尝试,但据我所知,我需要添加选项。。。对于每个对象的每个属性,否则我将抛出一个UnrecognedDoptionException。我需要它更一般化。您可以使用反射来查询类和填充选项对象。@LeguRi添加了一个不同的实现!最后,我将JSAP与BeanUtils一起使用,因此我将接受@Tomasz Nerkiewicz的answr,但赏金是你的!你让我激动了一秒钟:你让我激动了一秒钟:吊坠模式打开:-名字约翰不是posix风格-约翰的名字是posix风格。你用的是相同的吗?奇怪的windows/nix混合使用-version的java.exe?真的吗?吊坠模式打开:-名字约翰不是posix风格-约翰的名字是posix风格。你用的是相同的吗?奇怪的windows/nix混合使用-version的java.exe?真的吗?看起来JSAP和会是我的票。看起来JSAP和会是我的票。