通过反射动态调用类的静态方法和实例方法
1 mport java.lang.reflect.Constructor; 2 import java.lang.reflect.Method; 3 4 5 public class CallMethod { 6 7 public static void main(String[] args) throws Exception { 8 // 获取TestClass的Class对象 9 Class testClass = Class.forName(TestClass.class.getName()); 10 11 12 // (1)使用Class对象的newInstance方法创建一个实例,这种方法用默认构造方法创建对象 13 TestClass objectA = (TestClass) testClass.newInstance(); 14 System.out.println("Class的newInstance() 方法创建默认TestClass实例: " 15 + objectA.toString()); 16 // (2)使用构造方法创建实例。这就可以使用带参数的构造方法创建实例了 17 Constructor[] cons = testClass.getDeclaredConstructors(); 18 System.out.println("testClass有 " + cons.length + " 个构造方法"); 19 Constructor con = null; 20 for (int i = 0; i < cons.length; i++) { 21 con = cons[i]; 22 // 默认构造函数 23 if (con.getParameterTypes().length == 0) { 24 // 调用Constructor的newInstance方法创建实例 25 objectA = (TestClass) con.newInstance(null); 26 System.out 27 .println("Constructor 的 newInstance() 方法创建默认TestClass实例: " 28 + objectA.toString()); 29 } else { 30 // 带参数的构造函数 31 objectA = (TestClass) con.newInstance(new Object[] { 32 new Integer(55), new Integer(88) }); 33 System.out 34 .println("Constructor 的 newInstance() 方法创建带参数的TestClass实例: " 35 + objectA.toString()); 36 } 37 } 38 39 40 // 获取所有方法 41 Method[] methods = testClass.getMethods(); 42 // 获取某个特定的无参数的方法 43 Method saddMethod1 = testClass.getMethod("sadd", null); 44 Method addMethod1 = testClass.getMethod("add", null); 45 // 获取某个特定的有参数的方法 46 Method saddMethod2 = testClass.getMethod("sadd", new Class[] { 47 int.class, int.class }); 48 Method addMethod2 = testClass.getMethod("add", new Class[] { int.class, 49 int.class }); 50 51 52 // 调用不带参数的静态方法 53 int result = ((Integer) saddMethod1.invoke(null, null)).intValue(); 54 System.out.println("调用不带参数的静态方法sadd: " + result); 55 // 调用带参数的静态方法 56 result = ((Integer) saddMethod2.invoke(null, new Object[] { 57 new Integer(30), new Integer(70) })).intValue(); 58 System.out.println("调用带参数30, 70的静态方法sadd: " + result); 59 60 61 objectA = (TestClass) testClass.newInstance(); 62 // 调用不带参数的实例方法 63 result = ((Integer) addMethod1.invoke(objectA, null)).intValue(); 64 System.out.println("调用不带参数的实例方法add: " + result); 65 // 调用带参数的实例方法 66 result = ((Integer) addMethod2.invoke(objectA, new Object[] { 67 new Integer(130), new Integer(170) })).intValue(); 68 System.out.println("调用带参数130, 170的实例方法add: " + result); 69 70 // 不能访问私有方法 71 // Method sub = testClass.getMethod("sub", null); 72 // System.out.println(sub.invoke(objectA, null)); 73 } 74 75 // 测试类 76 class TestClass { 77 // 两个静态属性 78 static int sa = 100; 79 static int sb = 50; 80 // 两个实例属性 81 int a; 82 int b; 83 // 默认构造方法 84 public TestClass() { 85 this.a = 5; 86 this.b = 10; 87 } 88 // 带参数的构造方法 89 public TestClass(int a, int b) { 90 this.a = a; 91 this.b = b; 92 } 93 94 // 静态方法,实现add功能 95 public static int sadd() { 96 return sa + sb; 97 } 98 public static int sadd(int a, int b) { 99 return a + b; 100 } 101 // 实例方法,实现add功能 102 public int add() { 103 return this.a + this.b; 104 } 105 public int add(int a, int b) { 106 return a + b; 107 } 108 public String toString() { 109 return "a = " + this.a + "; b = " + this.b; 110 } 111 // 私有方法 112 private int sub() { 113 return this.a - this.b; 114 } 115 } 116 }