java - getMethod 的第二个参数是null和new Class[]{}的区别?
天蓬老师
天蓬老师 2017-04-18 10:48:53
0
2
996

在反射方法的时候,如果某方法没有参数
好像有下面两种方法去获得

getMethod(method_name_str, new Class[]{});
或者
getMethod(method_name_str, null);

请问这两种方法有区别吗?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回覆(2)
小葫芦

就效果來說,對於 Class 类的 getMethod 方法,这两种参数没有区别。
我们可以查看 getMethod 的源码,getMethod 層層呼叫之後,會使用下面的方法:

這個方法中,可以看到有一個 arrayContentsEq 方法用來匹配方法的參數:

可以發現,對於parameterTypesnull 的情況,和對於null 的情况,和对于 parameterTypes 为空数组(length == 0)的情况,效果是一样的 —— 假设此时我们要获取的方法 m 的参数为空,那么该方法的 m.getParameterTypes() 返回的数组(a2)的长度即为 0,我们可以发现 a1 == null 或者 a1.length == 0 的时候,arrayContentsEq 方法返回的都是 trueparameterTypes

為空數組(length == 0)的情況,效果是一樣的—— 假設此時我們要獲取的方法m 的參數為空,那麼該方法的m.getParameterTypes() 傳回的陣列(a2)的長度即為0,我們可以發現a1 == null 或者a1.length == 0 的時候,🎜 方法回傳的都是true(即符合成功)。 🎜
大家讲道理

如果某方法沒有參數,這兩種情況其實沒什麼差異。

跟蹤getMethod(String name, Class<?>... parameterTypes)的源码,可以发现如下代码,其中a1为传入的parameterTypesa2为根据参数name找到的Method实例调用的method.getParameterTypes()。程序根据比较a1a2来返回正确的Method

private static boolean arrayContentsEq(Object[] a1, Object[] a2) {
    if (a1 == null) {
        return a2 == null || a2.length == 0;
    }

    if (a2 == null) {
        return a1.length == 0;
    }

    if (a1.length != a2.length) {
        return false;
    }

    for (int i = 0; i < a1.length; i++) {
        if (a1[i] != a2[i]) {
            return false;
        }
    }

    return true;
}
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板