A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 姚志华 黑马帝   /  2011-10-8 20:02  /  3332 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

不是有调用方法而不用关心访问级别的吗?Method getDeclaredMethod(String name,Class[ ] params)
为什么还要用setAccessible(Boolean flag)设置取消或实施权限检查?

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
getDeclaredMetods();  返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
注意这里仅仅是能获取私有方法,但是不能调用的,必须使用
setAccessible(true);///调用private方法的关键一句话  
才能调用私有方法。

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 很给力!

查看全部评分

回复 使用道具 举报
getDeclaredMethod可以得到public、protected、private、默认这些方法,是得到而不是去执行,所以不会语言访问检查。

在执行invoke方法时分JVM会实施语言访问检查
这时就要设置setAccessible了

public void setAccessible(boolean flag) throws SecurityException
值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。可以访问私有域
值为 false 则指示反射的对象应该实施 Java 语言访问检查。 即不能访问私有域

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 赞一个!

查看全部评分

回复 使用道具 举报
Method getDeclaredMethod(String name,Class[ ] params)可以获得不包含从父类继承来的所有的构造方法之外的所有方法,包括public、private、protected和默认权限的方法。但private的方法却不可以直接访问,因为是私有的,这时如果你一定要访问的话就必须把得到的这个私有方法使用setAccessible(true)进行设置一下,意思是“我要使用暴力进行访问你”,这样就强行访问了这个private的私有方法了。

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 陈晓东 于 2011-10-9 17:15 编辑

getDeclaredMethod可以得到public、protected、private、默认这些方法,是得到而不是去执行。
AccessibleObject切换的能力提供了这些对象的访问检查。通过访问一个成员(例如,设置一个字段或者调用一个方法)默认检查有效性的访问(例如,调用外部定义类是禁止的私有方法)并引IllegalAccessException如果操作是不允许的。 如果访问的标志设置为true,这些检查被忽略了。这使得作为Java应用等特权对象序列化,检查人员,并有完整的调试器访问对象。
反射只要设置了setAccessible(true),那么即使是private也能改,但是依然不能动final的值

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马