我们都知道,正常的调用是无法访问对象修改后的属性和方法的,这也是Java的封装原则。
但是有没有办法强制访问对象的修饰属性和方法?那就是使用反射!(这可能会在面试问题中问到)
接下来,让我们看看它是如何实现的:
我们去jdk看一下描述属性的class Field,以及方法的class:
java.lang.
类字段
java.lang.
班级
可以看出这两个类有一个共同的特点,就是都继承自java.lang..类,我们来好好看看这个类的描述
java.lang.
班级
大致意思是:
此类是 Field 和 的超类,它允许反射对象禁用 Java 语言中的访问控制检测。控制检查是 、 () 、 和 。. . 等等等等等等。. .
这里贴出这个控制访问控制检测的方法:(这个类里也有一些相关的方法,有兴趣的可以自己去看看)
public void setAccessible(boolean flag) throws SecurityException
设置
为此价值。一个值
那个Java什么时候用的。一个值
那个Java。
大致意思:
设置一个标志来指示对象的值,如果为 true,则禁用 java 访问控制检查,如果为 false,则强制反射对象使用 java 访问控制检查
知道了这个方法java field对象set方法,可以做一个小例子来测试一下。
下面的例子很简单,就是定义一个狗类,它有一个属性和一个方法say。
在main函数中,先用反射来修改,然后在调用say方法的时候打印出来:
[爪哇]
{([]args){//获取Dog的Class对象 class=Class.(“Dog”);//生成对象的实例=.();//获取属性=.(“”) ;//禁止Field check.(true);//设置Field的值为””.set(obj,””);//获取say()方法=.(“say”,[]{} );// 禁止say方法的访问控制检查 say.(true);//调用say方法say.(obj,[]{});}}{// =””;//方法(){。出。(+“:”);}}
输出:小强:汪汪
这里有一个地方需要特别注意:
如果要使用反射来修改访问控制检查,则在获取和Field对象时必须使用sum。不要使用和。
虽然这两种方法的参数是一样的,但不同的是只能获取修改后的属性和方法。并且可以获取任意类型的属性和方法,因为这个例子需要调用私有的属性和方法java field对象set方法,所以使用它。
暂无评论内容