java - getMethod 的第二個(gè)參數(shù)是null和new Class[]{}的區(qū)別?
問題描述
在反射方法的時(shí)候,如果某方法沒有參數(shù)好像有下面兩種方法去獲得
getMethod(method_name_str, new Class[]{});或者getMethod(method_name_str, null);
請問這兩種方法有區(qū)別嗎?
問題解答
回答1:就效果來說,對于 Class 類的 getMethod 方法,這兩種參數(shù)沒有區(qū)別。我們可以查看 getMethod 的源碼,getMethod 層層調(diào)用之后,會(huì)使用下面的方法:
這個(gè)方法中,可以看到有一個(gè) arrayContentsEq 方法用來匹配方法的參數(shù):
可以發(fā)現(xiàn),對于 parameterTypes 為 null 的情況,和對于 parameterTypes 為空數(shù)組(length == 0)的情況,效果是一樣的 —— 假設(shè)此時(shí)我們要獲取的方法 m 的參數(shù)為空,那么該方法的 m.getParameterTypes() 返回的數(shù)組(a2)的長度即為 0,我們可以發(fā)現(xiàn) a1 == null 或者 a1.length == 0 的時(shí)候,arrayContentsEq 方法返回的都是 true(即匹配成功)。
回答2:如果某方法沒有參數(shù),這兩種情況其實(shí)沒什么差別。
跟蹤getMethod(String name, Class<?>... parameterTypes)的源碼,可以發(fā)現(xiàn)如下代碼,其中a1為傳入的parameterTypes,a2為根據(jù)參數(shù)name找到的Method實(shí)例調(diào)用的method.getParameterTypes()。程序根據(jù)比較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;}
相關(guān)文章:
1. javascript - git clone 下來的項(xiàng)目 想在本地運(yùn)行 npm run install 報(bào)錯(cuò)2. python - django 里自定義的 login 方法,如何使用 login_required()3. python如何不改動(dòng)文件的情況下修改文件的 修改日期4. mysql主從 - 請教下mysql 主動(dòng)-被動(dòng)模式的雙主配置 和 主從配置在應(yīng)用上有什么區(qū)別?5. angular.js - 不適用其他構(gòu)建工具,怎么搭建angular1項(xiàng)目6. 主從備份 - 跪求mysql 高可用主從方案7. android-studio - Android 動(dòng)態(tài)壁紙LayoutParams問題8. node.js - 使用 superagent 抓取 UTF-8網(wǎng)站亂碼9. mysql優(yōu)化 - mysql count(id)查詢速度如何優(yōu)化?10. sql語句如何按or排序取出記錄
