1

標準外の質問があります。

MyClass引数のリストを使用してコマンドラインから実行するクラスがあるとしましょう

[<key> <value>]

お気に入り:

MyClass -key1 arg1 -key2 arg2 -key3 arg3 ... -keyN argN.

したがって、私のクラスは、入力データをフィールドに渡すメソッドに従いました。

public class MyClass{

private static String arg1;
private static String arg2;
private static String arg3;
...
private static String argN;

private static void getArgs(String[] args) {
    for(int k=0; k<args.length; k=k+2){
        if(args[k].equals("-key1")){ 
            arg1 = args[k+1];                 
        }
        else if(args[k].equals("-key2")){ 
            arg2 = args[k+1];                 
        }   
        else if(args[k].equals("-key3")){ 
            arg3 = args[k+1];                 
        }

                    ...

        else if(args[k].equals("-keyN")){ 
            argN = args[k+1];                 
        }
    }   
}

私は自動化を書いておりMyClass、それぞれに10〜30のパラメーターがある約30〜40のがあります。

すべてのクラスには同じフィールドと異なるフィールドがあります (50/50)。

メソッドの実装は好きではありませんprivate static void getArgs(String[] args)。時間の無駄のようです。

Notepad++ で、Reg-ex に基づいて Java コードを生成するスクリプトを作成する必要がありますが、その前に、入力パラメーターを処理するための他のテクノロジ/テクニックを誰かが知っているかどうかを尋ねたいと思います。

[編集]

次のようなリフレクションを使用することを考えました。

for(int k=0; k<args.length; k=k+2){
 Field field = classInstance.getClass().getDeclaredField(args[k].substring(1));
 field.setAccessible(true);
 field.set(classInstance, args[k]);
}

ありがとうございました、

4

4 に答える 4

4

Commons CLIは、この問題に対する優れたソリューションを既に提供しています。すでに十分にテストされ、使用されているため、これを使用することをお勧めします。ライブラリを再発明しても意味がありません。

于 2013-08-11T13:38:21.533 に答える
2

提供する引数がほとんどない場合は、ランタイム引数を Java プログラムに渡すと便利です。ただし、プログラムに渡されるパラメーターの膨大なリストがあるシナリオではそうではありません。コマンドライン引数を使用して情報を提供する代わりに、プロパティファイルを使用することをお勧めします。また、Propertiesファイルにはキーと値のペアのデータも保持されているため、要件に対してより理にかなっています。また、java Propertiesクラスを使用してファイルから値を読み取ることも非常に便利です。

また、必要に応じて、プロパティ ファイル名 (フル パス付き) を引数として Java クラスに渡すことができます。

于 2013-08-11T12:37:11.303 に答える
0

引数リストから Map を作成するのは簡単です。

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");
...
于 2013-08-11T13:11:35.937 に答える