为什么说java反射效率低
1.Method#invoke 方法会对参数做封装和解封操作
invoke 方法的参数是 Object[] 类型,也就是说,如果方法参数是简单类型的话,需要在此转化成 Object 类型
2.需要检查方法可见性
反射时每次调用都必须检查方法的可见性(在 Method.invoke 里)
3.需要校验参数
4.反射方法难以内联
5.JIT 无法优化
对比getMethod 和 getDeclaredMethod,两个方法的区别
PUBLIC 会包括所有的 public 方法,包括父类的方法,而 DECLARED 会包括所有自己定义的方法,public,protected,private 都在此,但是不包括父类的方法。
getMethod是通过 getMethodsRecursive 获取到 MethodList 对象(链表),然后通过 MethodList#getMostSpecific 方法筛选出对应的方法。
getDeclaredMethod 方法的实现,通过 privateGetDeclaredMethods 获取方法以后,会通过 searchMethods 对方法进行筛选
在获取到对应方法以后,并不会直接返回,而是会通过 getReflectionFactory().copyMethod(method); 返回方法的一个拷贝。
invoke 方法的实现,分为三步:
1, 检查是否有权限调用方法, override 变量进行判断,如果 override == true,就跳过检查 我们通常在 Method#invoke 之前,会调用 Method#setAccessible(true),就是设置 override 值为 true。
2,获取 MethodAccessor
Method#copy 会给 Method 的 methodAccessor 赋值。所以这里的 methodAccessor 就是拷贝时使用的 MethodAccessor。
3, 调用 MethodAccessor#invoke 实现方法的调用
网友评论