反照获取成员函数(Method)版权声明

原创
小哥 2年前 (2022-12-30) 阅读数 65 #大杂烩

1.1.1 反射公开非静态成员方法

Method getDeclaredMethod(String name,Class ... parameterTypes)获取方法。

说明:

1) Class 类中 提供的getDeclaredMethod方法接收String name, name 表示需要反映的方法的名称。

因为类中可以有多个具有不同名称的方法。此方法的名称需要在反射期间指定,方法重载也可能发生在类中。此时,还需要指定具体反映的方法参数类型。

3) 要使方法反映到运行中,需要使用Method类中的invoke方法

Object invoke(Object obj, Object... args)

invoke方法中的第一个参数 Object obj:表示当前需要调用此方法的对象。

invoke方法中的第二个参数Object... args:

它表示真正需要运行的类中的反射方法需要接收的实际参数。

在调用Method类中的invoke方法,底层实际上正在运行反射方法,

由于某个方法正在运行,因此该方法运行后可能会有一个返回值。

举例: 需求:我们希望通过反射技术Person类中的setName()函数并让它执行。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

public class ReflectDemo {

public static void main(String[] args) throws Exception {

//获取Class对象

Class clazz = Class.forName( "com.baidu.reflect.demo.Person" );

/*

* 反射成员方法:

* public void setName(String name)

* 类中的非静态成员方法需要由对象调用。在我们反思该方法之后,我们必须最终运行该方法。

* 此时,一定还有一个物体。

*

* Method getDeclaredMethod(String name, Class<?>... parameterTypes)

* String name 反射方法的名称

* Class<?>... parameterTypes 反射方法接受的参数类型

*/

Method method = clazz.getDeclaredMethod( "setName" , String. class );

Person p = new Person();

//通过非反射方式执行setName函数

/*

*  Person p = new Person();

*  p.setName("赵四");

*  System.out.println(p.getName());//赵四

*/

//通过反思的方式执行setName函数

/*

* 要使方法反映到运行中,需要使用Method类中的invoke方法

*

*  Object invoke(Object obj, Object... args)

*

*  invoke方法中的第一个参数 Object obj:表示当前需要调用此方法的对象。

*  invoke方法中的第二个参数Object... args:

*          它表示真正需要运行的类中的反射方法需要接收的实际参数。

*  在调用Method类中的invoke方法,底层实际上正在运行反射方法,

*  由于某个方法正在运行,因此该方法运行后可能会有一个返回值。

*/

//执行setName函数   此代码调用反射。Person类中的setName方法

Object obj2 = method.invoke(p, "赵四" );

System.out.println(p); //cn.itcast.sh.reflect.demo.Person@7f21c5df

System.out.println(obj2); //null

System.out.println(p.getName()); //赵四

System.out.println( "=====================================" );

}

}

标签: JAVA

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门