java - getMethod 的第二个参数是null和new Class[]{}的区别?
问题描述
在反射方法的时候,如果某方法没有参数好像有下面两种方法去获得
getMethod(method_name_str, new Class[]{});或者getMethod(method_name_str, null);
请问这两种方法有区别吗?
问题解答
回答1:就效果来说,对于 Class 类的 getMethod 方法,这两种参数没有区别。我们可以查看 getMethod 的源码,getMethod 层层调用之后,会使用下面的方法:![java - getMethod 的第二个参数是null和new Class[]{}的区别?](http://www.haobala.com/attached/image/news/202307/0942160148.png)
这个方法中,可以看到有一个 arrayContentsEq 方法用来匹配方法的参数:![java - getMethod 的第二个参数是null和new Class[]{}的区别?](http://www.haobala.com/attached/image/news/202307/0942166515.png)
可以发现,对于 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. javascript - jQuery post()方法,里面的请求串可以转换为GBK编码么?可以的话怎样转换?2. python3.x - python 中的maketrans在utf-8文件中该怎么使用3. javascript - 一排三个框,各个框的间距是15px,距离外面的白框间距也是15px,这个css怎么写?4. javascript - nodejs调用qiniu的第三方资源抓取,返回401 bad token,为什么5. html5 - vue-cli 装好了 新建项目的好了,找不到项目是怎么回事?6. javascript - immutable配合react提升性能?7. mysql - C#连接数据库时一直这一句出问题int i = cmd.ExecuteNonQuery();8. django - python 2层文件夹导入9. python - 用urllib抓取网页上的下载链接,目标文件是xls形式,但发现抓下来的xls是空表,里面只有一句报错信息,求帮助。10. javascript - vue 手机端项目在进入主页后 在进入子页面,直接按返回出现空白情况

网公网安备