2022年java反射机制改变私有属性 .pdf
《2022年java反射机制改变私有属性 .pdf》由会员分享,可在线阅读,更多相关《2022年java反射机制改变私有属性 .pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、java(reflection) 反射机制改变私有 (private)属性值关键字 : java reflection private public class Student private int id=0; public int getId() return id; 问题:能否将 ReadOnlyClass 类的一个对象,把它的name属性的值由 hello改为 world? 如果能,请写出实现代码。如果不能请说明理由。答案:可以。利用java 的反射分析:任何一个类,我们可以得到它运行时的Class 实例,对于 Student 类,我们可以通过 Student.class得到它运行时的
2、 Class 实例,接着我们可以通过该类的 Class 实例去获得这个 id 属性所对应的 Field对象,我们知道对应一个类的属性都一个和它相关的Field 对象存在, 对于构造方法来说有一个Constructor对象存在,对于一个方法来说有一个对应的Method对象存在。通过这些我们可以利用反射来给这些属性动态的赋值。首先我们看看 JDK API 中 Class 类的两个方法的描述:public Field getField(String name)throws NoSuchFieldException,SecurityException 名师资料总结 - - -精品资料欢迎下载 - -
3、- - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - Returns a Field object that reflects the specified public member field of the class or interface represented by this Class object. The name parameter is a String specifying the simple name of the desired field.The fi
4、eld to be reflected is determined by the algorithm that follows. Let C be the class represented by this object:If C declares a public field with the name specified, that is the field to be reflected.If no field was found in step 1 above, this algorithm is applied recursively to each direct superinte
5、rface of C. The direct superinterfaces are searched in the order they were declared.If no field was found in steps 1 and 2 above, and C has a superclass S, then this algorithm is invoked recursively upon S. If C has no superclass, then a NoSuchFieldException is thrown.(翻译:返回一个 Field对象,它返回此 Class 对象所
6、表示的类或接口的指定public属性字段,id 参数是一个 int ,用于指定所需字段的简称。 要反映的字段由下面的算法确定。设 C为次对象所表示的类:如果C声明一个带有指定名的公共字段,则它就是要反映的字段。 如果在第 1 步中没有找到任何字段, 则该算法被递归的应用与 C的每一个直接超接口。 直接超接口按其声明的顺序进行搜索,如果在第1,2 两步没有找到任何字段,且C有一个超类 S,则在 S上递归调用该算法,如果 C没有超类则抛出 NoSuchFieldException.) public Field getDeclaredField(String name) throws NoSuchF
7、ieldException,SecurityException Returns a Field object that reflects the specified declared field of the class or interface represented by this Class object. The name parameter is a String that specifies the simple name of the desired field. Note that this method will not reflect the length field of
8、 an array class.(翻译:返回一个 Field对象, 该对象反映次 Class 对象所表示的类或接口的指定以声明字段, id 参数是一个 int , 它指定所需字段的简称, 次方法不反映数组类的length字段。 ) 从上面的 JDK API 我们知道,要得到id 属性对应的 Filed对象,我们只能调用class 的 getDeclaredField方法,因为 getField方法只能得到一个类的public的属性对应的 Field对象,而这里的 name属性是 private的,我们通过 Class的 getDeclaredField方法得到 id 属性对应的 Field 对
9、象后,我们就可以调用Filed 对象的 set 方法给 id 赋值。由于 id 是私有属性,我们要想知道我们到底改变了 id 的值没有,我们可以通过Filed类的父类的 setAccessible(boolean 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - flag) 方法类限制 java 语言 的访问限制。对于 setAccessible方法我们看 JDK文档:public void setAccessible(bool
10、ean flag)throws SecurityException Set the accessible flag for this object to the indicated boolean value. A value of true indicates that the reflected object should suppress Java language access checking when it is used. A value of false indicates that the reflected object should enforce Java langua
11、ge access checks.First, if there is a security manager, its checkPermission method is called with a ReflectPermission(suppressAccessChecks) permission. A SecurityException is raised if flag is true but accessibility of this object may not be changed (for example, if this element object is a Construc
12、tor object for the class Class). (翻译:将此对象的 accessible标志设置为指示的布尔值, 值为 true 则指示反射的对象在使用时应该取消java语言访问检查,值为False 则指示反射的对象应该事实java 语言访问检查。首先,如果存在安全管理器,则在ReflectPermission(suppressAccessChecks)权限下调用 checkPermission方法。如果 falg为 true ,并且不能更改次对象的可访问性(例如,如果次元素对象是 Class 类的 Constructor对象),。则会引发 SecurityException
13、。如果次对象是 java.lang.Class类的 Constructor对象,并且 flag 为 true ,则会引发 SecurityException 所以:public class StudentRef public static void main(String args) Student stu=new Student(); Class cla=Student.class ; Field filed = cla.getDeclaredField(id); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理
14、- - - - - - - 第 3 页,共 11 页 - - - - - - - - - field.setAccessible(true); field.set(stu,2); System.out.println(stu.getId(); 总结:对于一个类,它只有唯一个Class 对象,它来标识这个对象,这个Class对象就能够获得这个类的结构上的特征。那那么通过 Class 对象就可以来获得这个类相应的构造方法,属性等。获得某一个类它的Class 对应有 4 种方法:* 使用类的 .class语法* 使用类的对象的 getClass()方法, getClass() 方法在 Object
15、类里定义的* 通过 Class 对象的 forName() 方法* 对于包装类,可以通过 .TYPE方法通过类的反射机制,我们可以改变只读的私有(private )属性值Xukui: package com; publicclass Student privateintid =0; publicint getId() returnid ; privatevoid setId(Integer id) this. id = id; privatevoid setId() this. id = 100000; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - -
16、- - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - package com; import java.lang.reflect.Field; import java.lang.reflect.Method; publicclass StudentRef extends Student /*param args*throwsException*/publicstaticvoidmain(String args) throwsException Student stu = new Student(); /Class cla
17、 = Student.class;Class cla = Class.forName ( com.Student); Field filed = cla.getDeclaredField(id); filed.setAccessible(true); filed.set(stu, 2); System.out .println(stu.getId(); Method m = cla.getDeclaredMethod(setId, newClassClass.forName ( java.lang.Integer); m.setAccessible(true); m.invoke(stu, 1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年java反射机制改变私有属性 2022 java 反射 机制 改变 私有 属性
限制150内