如何获取与java中的参数相同的参数名称

时间:2016-09-26 15:29:33

标签: java reflection

public void parametersForValidation(String name,String address){
validateParameters(name,address);
}

private void validateParameters(Object... values){
for(Object value:values){
Objects.requirNonNull(value,"Value is mandatory");
}
}

我想要而不是"值是强制性的",参数名称如"名称是namdatory"和"地址是强制性的"应该来。 任何人都可以帮助..谢谢先知

2 个答案:

答案 0 :(得分:0)

调用方法没有这样的魔力。由于您将 values 传递给方法,因此这些参数不包含有关其参数角色的任何信息。实际上,没有保证传递给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选项编译了代码,则参数名称在运行时通过Reflection提供,即你可以使用

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");
        }
    }
}

这显然不仅仅是提供名称和交换明确的名称列表以及方法的名称和参数类型的显式列表以便反思地查找。

答案 1 :(得分:0)

不可行。

public void parametersForValidation(String name, String address) {
    Objects.requirNonNull(name, "name is mandatory");
    Objects.requirNonNull(address, "address is mandatory");
    ...
}

您可以使用

public void parametersForValidation(@NonNull String name, @NonNull String address) {
    ...
}

和注释处理。但是,因为Optional<?>我会简单地将它作为一个艰难的约定。并使用代码样式检查器。