在getMethod上使用新类<! - ? - > [] {}

时间:2014-04-06 15:54:12

标签: java reflection

之间有什么区别:

Method getIDMethod = MyInterface.class.getMethod("getId");

Method getIDMethod = MyInterface.class.getMethod("getId", new Class<?>[]{});

MyInterface如下:

public interface MyInterface {    
    AnotherInterface getId();    
}

2 个答案:

答案 0 :(得分:1)

不,没有区别。在第一种情况下将隐式生成空Class[]

The Java Language Specification states

  

变量arity方法的调用可能包含更多实际值   参数表达式比形式参数。所有的实际论点   表达式与前面的形式参数不对应   将评估变量arity参数并存储结果   到将传递给方法调用的数组中   (§15.12.4.2)。

关于invocation and evaluating arguments

  

如果使用m实际参数表达式调用k ≠ n,或者m   正在使用k = n实际参数表达式和类型调用   第k个参数表达式与T[]的赋值不兼容,   然后将参数列表(e1, ..., en-1, en, ..., ek) 评估为   它写成 (e1, ..., en-1, new |T[]| { en, ..., ek }),其中   |T[]|表示T[]的删除(第4.6节)。

从技术上讲,它等同于

new Class[]{} // instead of new Class<?>[]{}

答案 1 :(得分:0)

不,这两者之间没有区别,空数组表示方法没有参数

但如果您的方法接受任何参数,则必须使用第二种形式,如

Method getIDMethod = MyInterface.class.getMethod("setId", new Class<?>[]{String.class});
public interface MyInterface {    
    public void setId(String arg);    
}

这里是getMethodClass方法的声明,因为你看到第二个参数是params数组,发送空数组或没有发送任何内容之间没有区别

public Method getMethod(String name, Class<?>... parameterTypes)
    throws NoSuchMethodException, SecurityException {
// be very careful not to change the stack depth of this
// checkMemberAccess call for security reasons 
// see java.lang.SecurityManager.checkMemberAccess
    checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader());
    Method method = getMethod0(name, parameterTypes);
    if (method == null) {
        throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes));
    }
    return method;
}