呼び出されたメソッドにはこのような魔法はありません。 の値をメソッドに渡すので、これらの引数にはパラメータの役割に関する情報はありません。実際、validateParameters
に渡された値が呼び出し側コンテキストのパラメータであるという保証はありません。することができます。 validateParameters(Math.sin(2), null)
またはvalidateParameters(bufferedReader.readLine())
という名前で呼び出すと、null
に遭遇したときに、メソッドがその引数に対してどのような名前を取るべきか明確ではありません。 、パラメータ名は、リフレクション経由で実行時に利用可能な比較のために
private static String[] parameterNames={ "name", "address" };
public void parametersForValidation(String name,String address){
validateParameters(parameterNames, name, address);
}
private void validateParameters(String[] name, Object... values){
for(int ix=0; ix<name.length; ix++) {
if(values[ix]==null) {
throw new NullPointerException(name[ix]+" is mandatory");
}
}
}
、あなたが-parameters
オプションを使用してコードをコンパイルしていたJava 8 と使用している場合:最も簡単な解決策は、明示的にパラメータ名を提供することですすなわち、あなたは明らかに名前だけを提供するよりも簡単ではなく、反射をルックアップするメソッドの名前とパラメータの型の明示的なリストに名の明示的なリストを交換
public void parametersForValidation(String name, String address) {
String[] names;
try {
names = Arrays.stream(getClass()
.getMethod("parametersForValidation", String.class, String.class)
.getParameters()).map(Parameter::getName).toArray(String[]::new);
}
catch(ReflectiveOperationException ex) { throw new AssertionError(ex); }
validateParameters(names, name, address);
}
private void validateParameters(String[] name, Object... values) {
for(int ix=0; ix<name.length; ix++) {
if(values[ix]==null) {
throw new NullPointerException(name[ix]+ " is mandatory");
}
}
}
を使用することができますまあ。
パラメータの名前も渡します。名前と値を含むオブジェクト内に存在します。次に、その名前をメッセージに連結します(例:この 'Objects.requirNonNull(param.getValue()、param.getName()+"は必須です ");'のようなものです。 – Thomas
メソッドのパラメータ名の後ろにいる場合は、環境によって異なります。コンパイルされたコードに名前が含まれているかどうか(AFAIKはJava 8以上でのみ使用可能) - ここにあるもの:http://stackoverflow.com/questions/21455403/how-to-get-method-parameter-names-in-java -8-使用反射。 Java 8を使用できない場合、ビルドプロセスにフックすることで、より低いバージョンのJava用のパラメータ名を提供するライブラリがあります。しかしどちらの場合も、そのメソッドは 'validateParameters()'に渡す必要があります。何が渡されているかを知る。 – Thomas
ありがとうございますが、私はキーの値のペアのようにしたくありません。私はパラメータとしてアドレスを渡している場合、私は文字列形式でそのパラメータ名が欲しいです。 –