java - getMethod 的第二個參數是null和new Class[]{}的區別?
問題描述
在反射方法的時候,如果某方法沒有參數好像有下面兩種方法去獲得
getMethod(method_name_str, new Class[]{});或者getMethod(method_name_str, null);
請問這兩種方法有區別嗎?
問題解答
回答1:就效果來說,對于 Class 類的 getMethod 方法,這兩種參數沒有區別。我們可以查看 getMethod 的源碼,getMethod 層層調用之后,會使用下面的方法:
這個方法中,可以看到有一個 arrayContentsEq 方法用來匹配方法的參數:
可以發現,對于 parameterTypes 為 null 的情況,和對于 parameterTypes 為空數組(length == 0)的情況,效果是一樣的 —— 假設此時我們要獲取的方法 m 的參數為空,那么該方法的 m.getParameterTypes() 返回的數組(a2)的長度即為 0,我們可以發現 a1 == null 或者 a1.length == 0 的時候,arrayContentsEq 方法返回的都是 true(即匹配成功)。
回答2:如果某方法沒有參數,這兩種情況其實沒什么差別。
跟蹤getMethod(String name, Class<?>... parameterTypes)的源碼,可以發現如下代碼,其中a1為傳入的parameterTypes,a2為根據參數name找到的Method實例調用的method.getParameterTypes()。程序根據比較a1和a2來返回正確的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;}
相關文章:
1. 隨機數 - 有沒有用Python生成n個不重復隨機坐標的算法?2. 學html時,點“運行實例”點“提交”,右邊的白框框沒任何反應。3. python 字符串匹配問題4. javascript - vue 父子組件傳遞數據5. javascript - vue-router怎么不能實現跳轉呢6. docker不顯示端口映射呢?7. javascript - 怎么實現讓 div 里面的 img 元素 中心居中, 如下示例圖8. dockerfile - 我用docker build的時候出現下邊問題 麻煩幫我看一下9. javascript - 微信小程序 如何實現這種左滑動出現刪除的辦法?有相關api嗎?10. javascript - 自執行函數是當加載到這個js就執行函數了嗎
