天天看点

Java反射机制(三):调用对象的私有属性和方法

一、 通过反射调用类中的方法

在正常情况下,得到类的对象后,我们就可以直接调用类中的方法了,如果要想调用的话,则肯定必须清楚地知道要调用的方法是什么,之后通过class类中的getmethod方法,可得到method对象。

当获取到method对象后,可以通过该对象来执行方法,但是在方法调用的时候,因为会牵扯到方法中参数的问题,所以通过getmethod()取得的时候,必须设置好参数类型。

我们调用saychina()方法,此方法中没有任何参数。

执行调用的方法,需通过method的invoke方法来实现:

示例1:(调用无参的方法)

我们在person.java 类中定义了一个无参方法saychina和一个有参数的方法sayhello,接下来,我们调用无参数的方法:

输出: 作者:沉缘,国籍:china

可以看出,通过上述反射的方式,我们能够顺利的调用person类中的方法。 那思考下,如果我们要调用含有参数的方法sayhello,该如何做呢?

可以想象,如果方法里存在了参数,则必须设置参数的类型及内容。

输出: 沉缘,你好!我今年:25岁了!

二、 通过反射调用类中的setter及getter方法

setter和getter方法是访问类属性的标准方法,如果一个类中的属性被封装,则必须通过setter及getter方法设设置和取得,实际上此方法的操作之所以要这样规定,主要是由于反射机制可以给予支持。

通过反射可以调用setter及getter方法。

三、 通过反射调用属性

如果假设要操作一个类中的属性,则也可以通过field完成,而不必麻烦的通过setter和getter。class类中,获取类中field的方法:

1) 得到类中公共属性

2)得到本类属性

而在field类中,提供了获取属性内容及设置属性内容的方法:

1) 获取属性内容

2) 设置属性内容

还有一点需要注意,访问类中的私有属性时,必须要让该属性对外可见:

该方法继承自field的父类:

java.lang.reflect

只要把该方法的参数内容设置为true即可。

输出: 

姓名:沉缘

年龄:25

可见,操作属性,未必需要setter和getter方法的支持,但是,为了保证程序的安全性,最好还是通过setter和getter方法对属性进行操作。

四、 通过反射操作数组

反射机制不光能用在类中,也可以应用在任意的引用数据类型上,当然,这就包含了数组,数组使用array类完成。

class类中存在以下一个方法:

array类中得到数组指定下标的内容:

array类中修改内容:

array类中开辟新的数组:

取得数组信息并修改内容:

输出:

类型:int

长度:3

第一个内容:1

第一个内容:6

数组修改的过程,实际上就是创建一个新的数组的过程,所以要把旧的数组内容拷贝到新的数组中去。

nt数组的长度是:5

1、2、3、0、0、

-------------------------

java.lang.string数组的长度是:8

chenyuan、wuqing、lengxue、null、null、null、null、null、