有时候需要知道比Class类所提供的信息多得多的有关一个类型的信息。出于这种目的,可以使用程序包java.lang.reflect中的类,换句话说就是所说的反射API。这个类集提高了Class类的能力和有效性。
反射API支持一种名为自省的行为,这种行为实际上使一个类描述自身。
反射API使对象具有反射自己和发现自身内容的能力。程序包java.lang.reflect定义了很多类,这些类总体上对一个对象作了完整的描述。
下面给出了这3种类表示类的构建块:
(1)Constructor类的每个实例都提供了关于一个类的一个构造函数的信息,并且为调用程序提供了使用这个构造函数以创建一个对象的方式。
(2)Method类的每个实例都提供了关于一个类的一种方法的信息,并且为调用程序提供了调用这种方法的方式。这种方法可能是类的方法或者实例的方法,而且可能是抽象的。
(3)Field类的每个实例都提供了关于一个类的一个域的信息,并且为调用程序提供了获得和设置这个域的值的方法。这个域可以是类变量或者实例变量。
下面用一个例子帮助大家了解:
1import java.lang.reflect.*;
2
3public class ReflectionDemo
4{
5 public static void main(String[] args)
6 {
7 try
8 {
9 ReflectionDemo demo = new ReflectionDemo();
10
11 Method myMethod;
12 Class[] parameterTypes;
13 Object[] parameters;
14 Object result;
15
16 TestClass testObj = new TestClass();
17 Class myClass = testObj.getClass();
18
19 System.out.println("Methods defined in class " + myClass.getName());
20 demo.printMethods(myClass);
21 System.out.println();
22
23 //input parameter types for method
24 parameterTypes = new Class[]{int.class, String.class};
25
26 //input parameter for method
27 parameters = new Object[] {new Integer(2), "this is test"};
28
29 //get method by name and parameter types
30 myMethod = myClass.getMethod("test1", parameterTypes);
31
32 //run it
33 System.out.println(myMethod.getName());
34 result = demo.execute(testObj, myMethod, parameters);
35 System.out.println("Returned value: " + result);
36
37 //input parameter types for method
38 parameterTypes = new Class[] {int[].class};
39
40 //input parameters for method
41 int[] nums = {1, 2, 3, 4, 5};
42 parameters = new Object[] {nums};
43
44 //get method by name parameter types
45 myMethod = myClass.getMethod("test2", parameterTypes);
46
47 //run it
48 System.out.println(myMethod.getName());
49 result = demo.execute(testObj, myMethod, parameters);
50 System.out.println("Result value: " + result);
51
52 //input parameter types for method
53 parameterTypes = new Class[] {};
54
55 //input parameters for method
56 parameters = new Object[] {};
57 myMethod = myClass.getMethod("test3", parameterTypes);
58
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
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
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
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
96 throw new Exception(errorMsg);
97
98 }
99}
100
101class TestClass
102{
103 public void test1(int i, String str)
104 {
105 System.out.println("1 = " + i + " and " + "str = \"" + str + "\"");
106 }
107
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
114 return sum;
115 }
116
117 public String test3()
118 {
119 return "\"No input parameter\"";
120 }
121}
122
123
124
2
3public class ReflectionDemo
4{
5 public static void main(String[] args)
6 {
7 try
8 {
9 ReflectionDemo demo = new ReflectionDemo();
10
11 Method myMethod;
12 Class[] parameterTypes;
13 Object[] parameters;
14 Object result;
15
16 TestClass testObj = new TestClass();
17 Class myClass = testObj.getClass();
18
19 System.out.println("Methods defined in class " + myClass.getName());
20 demo.printMethods(myClass);
21 System.out.println();
22
23 //input parameter types for method
24 parameterTypes = new Class[]{int.class, String.class};
25
26 //input parameter for method
27 parameters = new Object[] {new Integer(2), "this is test"};
28
29 //get method by name and parameter types
30 myMethod = myClass.getMethod("test1", parameterTypes);
31
32 //run it
33 System.out.println(myMethod.getName());
34 result = demo.execute(testObj, myMethod, parameters);
35 System.out.println("Returned value: " + result);
36
37 //input parameter types for method
38 parameterTypes = new Class[] {int[].class};
39
40 //input parameters for method
41 int[] nums = {1, 2, 3, 4, 5};
42 parameters = new Object[] {nums};
43
44 //get method by name parameter types
45 myMethod = myClass.getMethod("test2", parameterTypes);
46
47 //run it
48 System.out.println(myMethod.getName());
49 result = demo.execute(testObj, myMethod, parameters);
50 System.out.println("Result value: " + result);
51
52 //input parameter types for method
53 parameterTypes = new Class[] {};
54
55 //input parameters for method
56 parameters = new Object[] {};
57 myMethod = myClass.getMethod("test3", parameterTypes);
58
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
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
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
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
96 throw new Exception(errorMsg);
97
98 }
99}
100
101class TestClass
102{
103 public void test1(int i, String str)
104 {
105 System.out.println("1 = " + i + " and " + "str = \"" + str + "\"");
106 }
107
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
114 return sum;
115 }
116
117 public String test3()
118 {
119 return "\"No input parameter\"";
120 }
121}
122
123
124
结果如下:
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"