黑马程序员技术交流社区

标题: setAccessible(Boolean flag) [打印本页]

作者: 姚志华    时间: 2011-10-8 20:02
标题: setAccessible(Boolean flag)
不是有调用方法而不用关心访问级别的吗?Method getDeclaredMethod(String name,Class[ ] params)
为什么还要用setAccessible(Boolean flag)设置取消或实施权限检查?
作者: 鲁蒙    时间: 2011-10-8 20:16
getDeclaredMetods();  返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
注意这里仅仅是能获取私有方法,但是不能调用的,必须使用
setAccessible(true);///调用private方法的关键一句话  
才能调用私有方法。
作者: 林国锋    时间: 2011-10-8 20:30
getDeclaredMethod可以得到public、protected、private、默认这些方法,是得到而不是去执行,所以不会语言访问检查。

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

public void setAccessible(boolean flag) throws SecurityException
值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。可以访问私有域
值为 false 则指示反射的对象应该实施 Java 语言访问检查。 即不能访问私有域
作者: 王家俊    时间: 2011-10-8 23:54
Method getDeclaredMethod(String name,Class[ ] params)可以获得不包含从父类继承来的所有的构造方法之外的所有方法,包括public、private、protected和默认权限的方法。但private的方法却不可以直接访问,因为是私有的,这时如果你一定要访问的话就必须把得到的这个私有方法使用setAccessible(true)进行设置一下,意思是“我要使用暴力进行访问你”,这样就强行访问了这个private的私有方法了。

作者: 陈晓东    时间: 2011-10-9 17:14
本帖最后由 陈晓东 于 2011-10-9 17:15 编辑

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





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2