有时候需要知道比Class类所提供的信息多得多的有关一个类型的信息。出于这种目的,可以使用程序包java.lang.reflect中的类,换句话说就是所说的反射API。这个类集提高了Class类的能力和有效性。
反射API支持一种名为自省的行为,这种行为实际上使一个类描述自身。
反射API使对象具有反射自己和发现自身内容的能力。程序包java.lang.reflect定义了很多类,这些类总体上对一个对象作了完整的描述。
下面给出了这3种类表示类的构建块:
(1)Constructor类的每个实例都提供了关于一个类的一个构造函数的信息,并且为调用程序提供了使用这个构造函数以创建一个对象的方式。
(2)Method类的每个实例都提供了关于一个类的一种方法的信息,并且为调用程序提供了调用这种方法的方式。这种方法可能是类的方法或者实例的方法,而且可能是抽象的。
(3)Field类的每个实例都提供了关于一个类的一个域的信息,并且为调用程序提供了获得和设置这个域的值的方法。这个域可以是类变量或者实例变量。
下面用一个例子帮助大家了解:
1
import java.lang.reflect.*;
2![](/Images/OutliningIndicators/None.gif)
3
public class ReflectionDemo
4
{
5
public static void main(String[] args)
6
{
7
try
8
{
9
ReflectionDemo demo = new ReflectionDemo();
10![](/Images/OutliningIndicators/InBlock.gif)
11
Method myMethod;
12
Class[] parameterTypes;
13
Object[] parameters;
14
Object result;
15![](/Images/OutliningIndicators/InBlock.gif)
16
TestClass testObj = new TestClass();
17
Class myClass = testObj.getClass();
18![](/Images/OutliningIndicators/InBlock.gif)
19
System.out.println("Methods defined in class " + myClass.getName());
20
demo.printMethods(myClass);
21
System.out.println();
22![](/Images/OutliningIndicators/InBlock.gif)
23
//input parameter types for method
24
parameterTypes = new Class[]{int.class, String.class};
25![](/Images/OutliningIndicators/InBlock.gif)
26
//input parameter for method
27
parameters = new Object[] {new Integer(2), "this is test"};
28![](/Images/OutliningIndicators/InBlock.gif)
29
//get method by name and parameter types
30
myMethod = myClass.getMethod("test1", parameterTypes);
31![](/Images/OutliningIndicators/InBlock.gif)
32
//run it
33
System.out.println(myMethod.getName());
34
result = demo.execute(testObj, myMethod, parameters);
35
System.out.println("Returned value: " + result);
36![](/Images/OutliningIndicators/InBlock.gif)
37
//input parameter types for method
38
parameterTypes = new Class[] {int[].class};
39![](/Images/OutliningIndicators/InBlock.gif)
40
//input parameters for method
41
int[] nums = {1, 2, 3, 4, 5};
42
parameters = new Object[] {nums};
43![](/Images/OutliningIndicators/InBlock.gif)
44
//get method by name parameter types
45
myMethod = myClass.getMethod("test2", parameterTypes);
46![](/Images/OutliningIndicators/InBlock.gif)
47
//run it
48
System.out.println(myMethod.getName());
49
result = demo.execute(testObj, myMethod, parameters);
50
System.out.println("Result value: " + result);
51![](/Images/OutliningIndicators/InBlock.gif)
52
//input parameter types for method
53
parameterTypes = new Class[] {};
54![](/Images/OutliningIndicators/InBlock.gif)
55
//input parameters for method
56
parameters = new Object[] {};
57
myMethod = myClass.getMethod("test3", parameterTypes);
58![](/Images/OutliningIndicators/InBlock.gif)
59
//run it
60
System.out.println(myMethod.getName());
61
result = demo.execute(testObj, myMethod, parameters);
62
System.out.println("Returned value: " + result);
63
}
64
catch(Exception e)
65
{
66
System.out.println(e);
67
}
68
}
69![](/Images/OutliningIndicators/InBlock.gif)
70
//print out definition of declared methods
71
public void printMethods(Class aClass)
72
{
73
Method[] ms = aClass.getDeclaredMethods();
74
for(int i = 0; i < ms.length; i ++)
75
{
76
System.out.println(ms[i].toString());
77
}
78
}
79![](/Images/OutliningIndicators/InBlock.gif)
80
//execute method of an object with given parameters
81
public Object execute(Object classObject, Method myMethod, Object[] parameters) throws Exception
82
{
83
String errorMsg;
84![](/Images/OutliningIndicators/InBlock.gif)
85
try
86
{
87
//run the method
88
return myMethod.invoke(classObject, parameters);
89
}
90
catch(InvocationTargetException invokeE)
91
{
92
//catch exception thrown by the invoked method
93
errorMsg = invokeE.getTargetException().getMessage();
94
}
95![](/Images/OutliningIndicators/InBlock.gif)
96
throw new Exception(errorMsg);
97![](/Images/OutliningIndicators/InBlock.gif)
98
}
99
}
100![](/Images/OutliningIndicators/None.gif)
101
class TestClass
102
{
103
public void test1(int i, String str)
104
{
105
System.out.println("1 = " + i + " and " + "str = \"" + str + "\"");
106
}
107![](/Images/OutliningIndicators/InBlock.gif)
108
public int test2(int[] nums)
109
{
110
int sum = 0;
111
for(int i = 0; i < nums.length; i ++)
112
sum += nums[i];
113![](/Images/OutliningIndicators/InBlock.gif)
114
return sum;
115
}
116![](/Images/OutliningIndicators/InBlock.gif)
117
public String test3()
118
{
119
return "\"No input parameter\"";
120
}
121
}
122![](/Images/OutliningIndicators/None.gif)
123![](/Images/OutliningIndicators/None.gif)
124![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/InBlock.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
42
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/InBlock.gif)
47
![](/Images/OutliningIndicators/InBlock.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/InBlock.gif)
50
![](/Images/OutliningIndicators/InBlock.gif)
51
![](/Images/OutliningIndicators/InBlock.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/InBlock.gif)
56
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
57
![](/Images/OutliningIndicators/InBlock.gif)
58
![](/Images/OutliningIndicators/InBlock.gif)
59
![](/Images/OutliningIndicators/InBlock.gif)
60
![](/Images/OutliningIndicators/InBlock.gif)
61
![](/Images/OutliningIndicators/InBlock.gif)
62
![](/Images/OutliningIndicators/InBlock.gif)
63
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
64
![](/Images/OutliningIndicators/InBlock.gif)
65
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
66
![](/Images/OutliningIndicators/InBlock.gif)
67
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
68
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
69
![](/Images/OutliningIndicators/InBlock.gif)
70
![](/Images/OutliningIndicators/InBlock.gif)
71
![](/Images/OutliningIndicators/InBlock.gif)
72
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
73
![](/Images/OutliningIndicators/InBlock.gif)
74
![](/Images/OutliningIndicators/InBlock.gif)
75
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
76
![](/Images/OutliningIndicators/InBlock.gif)
77
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
78
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
79
![](/Images/OutliningIndicators/InBlock.gif)
80
![](/Images/OutliningIndicators/InBlock.gif)
81
![](/Images/OutliningIndicators/InBlock.gif)
82
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
83
![](/Images/OutliningIndicators/InBlock.gif)
84
![](/Images/OutliningIndicators/InBlock.gif)
85
![](/Images/OutliningIndicators/InBlock.gif)
86
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
87
![](/Images/OutliningIndicators/InBlock.gif)
88
![](/Images/OutliningIndicators/InBlock.gif)
89
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
90
![](/Images/OutliningIndicators/InBlock.gif)
91
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
92
![](/Images/OutliningIndicators/InBlock.gif)
93
![](/Images/OutliningIndicators/InBlock.gif)
94
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
95
![](/Images/OutliningIndicators/InBlock.gif)
96
![](/Images/OutliningIndicators/InBlock.gif)
97
![](/Images/OutliningIndicators/InBlock.gif)
98
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
99
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
100
![](/Images/OutliningIndicators/None.gif)
101
![](/Images/OutliningIndicators/None.gif)
102
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
103
![](/Images/OutliningIndicators/InBlock.gif)
104
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
105
![](/Images/OutliningIndicators/InBlock.gif)
106
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
107
![](/Images/OutliningIndicators/InBlock.gif)
108
![](/Images/OutliningIndicators/InBlock.gif)
109
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
110
![](/Images/OutliningIndicators/InBlock.gif)
111
![](/Images/OutliningIndicators/InBlock.gif)
112
![](/Images/OutliningIndicators/InBlock.gif)
113
![](/Images/OutliningIndicators/InBlock.gif)
114
![](/Images/OutliningIndicators/InBlock.gif)
115
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
116
![](/Images/OutliningIndicators/InBlock.gif)
117
![](/Images/OutliningIndicators/InBlock.gif)
118
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
119
![](/Images/OutliningIndicators/InBlock.gif)
120
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
121
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
122
![](/Images/OutliningIndicators/None.gif)
123
![](/Images/OutliningIndicators/None.gif)
124
![](/Images/OutliningIndicators/None.gif)
结果如下:
Methods defined in class TestClass
public void TestClass.test1(int,java.lang.String)
public int TestClass.test2(int[])
public java.lang.String TestClass.test3()
test1
1 = 2 and str = "this is test"
Returned value: null
test2
Result value: 15
test3
Returned value: "No input parameter"