有沒有這樣的魔術被調用的方法。由於您將值傳遞給方法,因此這些參數不包含有關其參數角色的任何信息。實際上,傳遞給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");
}
}
}
爲了比較,如果您使用的是Java 8 和編譯使用-parameters
選項代碼,參數名稱可在通過反射運行,也就是說,你可以使用
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");
}
}
}
這顯然是不不僅僅是提供簡單的名稱和交換名稱的顯式列表的名稱和參數類型的方法的顯式列表來查找反射LY。
也傳遞參數的名稱,例如,在包含名稱和值的對象中。然後將該名稱連接到該消息,例如像這樣'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
謝謝,但我不想像關鍵值對那樣。如果我將地址作爲參數傳遞,那麼我需要字符串格式的參數名稱。 –