java反射field.setAccessible()方法作用

java反射field.setAccessible()方法作用Accessable 属性是继承自 AccessibleOb 类 功能是启用或禁用安全检查 JDKAPI 中的解释引用 AccessibleOb 类是 Field Method 和 Constructor 对象的基类 它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力 对于公共成员 默认 打包 访问成员 受保护成员和私有成员 在分别使用 Field Method

Accessable属性是继承自AccessibleObject 类. 功能是启用或禁用安全检查

JDK API中的解释

引用
AccessibleObject 类是 Field、Method 和 Constructor 对象的基类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用 Field、Method 或 Constructor 对象来设置或获得字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查。
在反射对象中设置 accessible 标志允许具有足够特权的复杂应用程序(比如 Java Object Serialization 或其他持久性机制)以某种通常禁止使用的方式来操作对象。




//将此对象的 accessible 标志设置为指示的布尔值 public void setAccessible(boolean flag) throws SecurityException 

flag=true:指示反射的对象在使用时应该取消 Java 语言访问检查。flag=false:指示反射的对象应该实施 Java 语言访问检查。

实际上setAccessible是启用和禁用访问安全检查的开关,并不是为true就能访问,为false就不能访问,一般情况下,我们并不能对类的私有字段进行操作,利用反射也不例外,但有的时候,例如要序列化的时候,我们又必须有能力去处理这些字段,这时候,我们就需要调用AccessibleObject上的setAccessible()方法来允许这种访问,而由于反射类中的Field,Method和Constructor继承自AccessibleObject,因此,通过在这些类上调用setAccessible()方法,我们可以实现对这些字段的操作。但有的时候这将会成为一个安全隐患,为此,我们可以启用java.security.manager来判断程序是否具有调用setAccessible()的权限。默认情况下,内核API和扩展目录的代码具有该权限,而类路径或通过URLClassLoader加载的应用程序不拥有此权限。例如:当我们以这种方式来执行上述程序时将会抛出异常

java.lang.IllegalAccessException: Class com.example.xj.myapplication.TestField can not access a member of class com.example.xj.myapplication.Student with modifiers "private" at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102) at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296) at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288) at java.lang.reflect.Field.get(Field.java:390) at com.example.xj.myapplication.TestField.main(TestField.java:20) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

Student.class
获取变量:
Field field = student.getClass().getDeclaredField("phone"); field.setAccessible(true); Object o = field.get(student);

获取方法:

Method method = student.getClass().getDeclaredMethod("getName",String.class); Object object = method.invoke(student,"张三"); System.out.println("反射方法获取返回结果:" + object);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218700.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午11:40
下一篇 2026年3月17日 下午11:40


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号