反射机制典例

 

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

 

你可能感兴趣的:(java,反射,职场,休闲)