JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能:在运行时判定任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判定任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
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
43
44
45
|
package
com.java.jvm;
import
java.lang.reflect.*;
class
InvokeTest {
public
static
void
main(String[] args) {
try
{
Class c = Class.forName(
"com.java.jvm.User"
);
Object o = c.newInstance();
Method m = c.getMethod(
"getName"
,
null
);
Object ret = m.invoke(o,
null
);
System.out.println(
"com.java.jvm.User.getName() = "
+ ret);
m = c.getMethod(
"setName"
,
new
Class[]{String.
class
});
ret = m.invoke(o,
new
Object[]{
"shengjian"
});
System.out.println(
"com.java.jvm.User.setName() = "
+ ret);
m = c.getMethod(
"getName"
,
null
);
ret = m.invoke(o,
null
);
System.out.println(
"com.java.jvm.User.getName() = "
+ ret);
//静态方法的调用
m = c.getMethod(
"getUserName"
,
new
Class[]{String.
class
});
ret = m.invoke(
null
,
"fuwang"
);
System.out.println(
"com.java.jvm.User.getUserName() = "
+ ret);
}
catch
(ClassNotFoundException ex) {
System.out.println(
"找不到此类别"
);
}
catch
(NoSuchMethodException ex) {
System.out.println(
"此方法不存在"
);
}
catch
(IllegalAccessException ex) {
System.out.println(
"没有权限调用此方法"
);
}
catch
(InvocationTargetException ex) {
System.out.println(
"调用此方法时发生下列例外:\n"
+ ex.getTargetException());
}
catch
(IllegalArgumentException e) {
e.printStackTrace();
}
catch
(InstantiationException e) {
e.printStackTrace();
}
}
}
|
name - 方法名 parameterTypes - 参数列表
Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。
invoke()
对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。
如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。
如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。
如果底层方法是实例方法,则使用动态方法查找来调用它,这一点记录在 Java Language Specification, Second Edition 的第 15.12.4.4 节中;在发生基于目标对象的运行时类型的重写时更应该这样做。
如果底层方法是静态的,并且尚未初始化声明此方法的类,则会将其初始化。
如果方法正常完成,则将该方法返回的值返回给调用者;如果该值为基本类型,则首先适当地将其包装在对象中。但是,如果该值的类型为一组基本类型,则数组元素不 被包装在对象中;换句话说,将返回基本类型的数组。如果底层方法返回类型为 void,则该调用返回 null。
obj - 从中调用底层方法的对象args - 用于方法调用的参数。
User代码:
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
43
44
45
|
package
com.java.jvm;
public
class
User {
static
{
System.out.println(
"static ---"
);
}
public
User(){
System.out.println(
"name="
+name);
name=
"xiaotian"
;
}
private
String name;
private
Integer age;
private
String address;
public
static
String getUserName(String name){
return
name;
}
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
public
Integer getAge() {
return
age;
}
public
void
setAge(Integer age) {
this
.age = age;
}
public
String getAddress() {
return
address;
}
public
void
setAddress(String address) {
this
.address = address;
}
@Override
public
String toString() {
return
"User [name="
+ name +
", age="
+ age +
", address="
+ address
+
"]"
;
}
}
|