反照获取成员函数(Method)版权声明
原创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
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除