ぐる式 (貳) より引っ越し作業中.未完.

2006年6月19日月曜日

Java の触診,蹴り出し,シェル・スクリプトの引数

メソッドへの出動要請

以前はリフレクション使ってこんなことやってたんだが.

    Method method = null;    ReternObject retval = null;    method = targetObject.getClass().getMethod(methodName, null);    if (method != null) {      retval = (ReternObject) method.invoke(targetObject, null);    }

org.apache.commons の beanutils に PropertyUtils という便利なクラスがあるですよ.まぁ, beanutils という名のとおりなんで,非 bean なクラスには使えんのだろうけど,今回の対象は bean なもんで.

    Object value = null;    Object target = fetch();    if (target != null) {      String propertyName = field.getName();      try {        Class propClass = PropertyUtils.getPropertyType(target, propertyName);        value = PropertyUtils.getProperty(target, propertyName);        if (Collection.class.isAssignableFrom(propClass)) {         ...        }      } catch (FooException e) {        e.printStackTrace();        ...      }      ...    }    return value;

外部コマンド起動

まぁ,こんな感じでエエんでない.出力が欲しければ process から getInputStream() なり getErrorStream() して書き出せばよろしい.

    ProcessBuilder processBuilder = new ProcessBuilder(String... command);    try {      Process process = processBuilder.start();      ret = process.waitFor();      log.info(command + " exited: " + ret);    } catch (IOException e) {      // start()       e.printStackTrace();    } catch (InterruptedException e) {      // waitFor()      e.printStackTrace();    }    return ret;

ちなみに, List<String> command から String... command への変換は.

String[] cmds = (String[])command.toArray(new String[0]);

クチはこんな感じで開いてる.

public static int execute(List<String> command); public static int execute(String... command);

シェル・スクリプトの引数

Red Hat Linux ES3 のシェル・スクリプトまで書かされている.おりゃ,シェル・スクリプトなんて書けねぇっての (笑).

...while truedo        case "$1" in        --?*) A_OPTIONS="$A_OPTIONS -${1#--}" ;;        -?*) B_OPTIONS="$B_OPTIONS $1" ;;        *)  break ;;        esac        shiftdone...

この中で動かすコマンドが二種類あって,どれも引数は -[A-z] .* という形で与えなくてはならなくて,しかもコマンド A とコマンド B のオプションには,ほとんど同じような意味であっても表現には全く互換性がない,と.しょんがないから片一方のオプション指定は -- で始めることにして,パターン・マッチで小細工を労する (笑).オプション指定一文字とサブ・オプションの間にはスペースが入る場合があるが,それはこれを起動するクラスの方で,単位ごとにクウォートするようにして起動することで対処.とりあえず,動いてます (笑).

0 件のコメント:

コメントを投稿