ちょっと知らなかったので、メモ。
可変長引数メソッドの呼び出しは、実は引数なしの形でも呼び出させる(!!)
知らなかった。びっくりした。
実際にはこんな感じ。
/** * * 可変長引数メソッド実装クラス * */ public class VariableLengthArgsTest{ /** * 可変長引数のメソッド * @param args 可変長引数 */ public void doOperation(String... args) { // 処理 } }
/** * * 可変長引数メソッド呼び出しクラス * */ public class VariableLengthArgsCaller{ /** * 可変長引数のメソッド呼び出し * @param args 可変長引数 */ public static void main(String[] args) { VariableLengthArgsTest test = new VariableLengthArgsTest(); // この記述はOK test.doOperation(); } }
ただし、リフレクションを使って引数なしの形での呼び出しは出来ないので注意。
/** * * 可変長引数メソッド呼び出しクラス(リフレクション) * */ public class VariableLengthArgsReflectionCaller{ /** * 可変長引数のメソッド呼び出し * @param args 可変長引数 */ public static void main(String[] args) { Class<?> vlArgsTest = Class.forName("com.yy.yank.test.VariableLengthArgsTest"); // これはNG Method m = vlArgsTest.getMethod("doOperation", null); m.invoke(vlArgsTest.newInstance(), null); } }
こう書いたらたぶん大丈夫。
/** * 可変長引数のメソッド呼び出し * @param args 可変長引数 */ public static void main(String[] args) { Class<?> vlArgsTest = Class.forName("com.yy.yank.test.VariableLengthArgsTest"); // これならOK Method m = vlArgsTest.getMethod("doOperation",new Class[]{ String[].class }); m.invoke(vlArgsTest.newInstance(), new Object[]{ new String[]{ }}); }
つまり、引数なしのメソッド→可変長引数のメソッドに変更したとしても、
リフレクションを使わない限りは既存クラスへの影響は少ないといえる(コンパイル
も実行も問題なく行える)。
もちろん、デグレが起こっていないかなどメンテナンスは必要だけどもね。
一応解説。
可変長引数メソッド
メソッド実装時、引数を「String args...」 という感じでピリオドを3つ付ける
と、
任意の引数をいれてメソッド呼び出しが出来る。
リフレクション
Javaのソース内で文字列を使ってクラス、メソッド、インスタンスなどを
間接的に呼び出す方法のこと。
This article is my skill note about variable length arguments method calling.
I didn't know which variable length arguments method can call like No arguments method.
I wrote Sample Source by this article.
It is important to note is Reflection(ex Method invoke).
Reflection can't call variable length arguments method like No arguments method.
0 件のコメント:
コメントを投稿