有没有这样的魔术被调用的方法。由于您将值传递给方法,因此这些参数不包含有关其参数角色的任何信息。实际上,传递给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
谢谢,但我不想像关键值对那样。如果我将地址作为参数传递,那么我需要字符串格式的参数名称。 –