这里主要讲解获取运行时类的特定的属性和类的特定的方法:
获取运行时类的对象的属性:
getFields方法和getDeclardFields
结果:
对于获取到的属性的赋值:通过get和set方法
- 在Field中:
- public Object get(Object obj) 取得指定对象obj上此Field的属性内容
- public void set(Object obj,Object value) 设置指定对象obj上此Field的属性内容
注意:
person中我们对于私有的属性age的获取,我们是无法直接对age进行set和get的操作。
注:在类中属性都设置为private的前提下,在使用set()和get()方法时,首先要使用Field类中的setAccessible(true)方法将需要操作的属性设置为可以被外部访问。
publicvoid setAccessible(true)访问私有属性时,让这个属性可见。
本来age是person的私有属性,这是类的封装性(Public,private),但是现在我们打破了类的封装性。
通过反射调用类中指定的方法:
通过反射,调用类中的方法,通过Method类完成。步骤:
1.通过Class类的getMethod(Stringname,Class…parameterTypes)方法取得一个Method对象,并设置此方法操作时所需要的参数类型。这个是获取运行时类中声明为public的方法。
2.之后使用Object invoke(Object obj, Object[] args)进行调用,并向方法中传递要设置的obj对象的参数信息。
Invoke()说明:
说明:
1.Object 对应原方法的返回值,若原方法无返回值,此时返回null
2.若原方法若为静态方法,此时形参Object obj可为null
3.若原方法形参列表为空,则Object[] args为null
4.若原方法声明为private,则需要在调用此invoke()方法前,显式调用方法对象的setAccessible(true)方法,将可访问private的方法
结果:
我们在前面强调的运行时类是反射的基础。在这里应该可以体会出来了吧。如果没有运行时类,我们的这行属性,方法就没有办法获取。