Java 反射

来源:互联网 发布:网络管理协议 编辑:程序博客网 时间:2024/05/18 17:24

 通过反射动态调用类的静态方法和实例方法

import java.lang.reflect.Constructor;import java.lang.reflect.Method;/** * 通过反射动态调用类的静态方法和实例方法。 */public class CallMethod {public static void main(String[] args) throws Exception {// 获取TestClass的Class对象Class testClass = Class.forName(TestClass.class.getName());/** *** 创建实例 **** */// (1)使用Class对象的newInstance方法创建一个实例,这种方法用默认构造方法创建对象TestClass objectA = (TestClass) testClass.newInstance();System.out.println("Class的newInstance() 方法创建默认TestClass实例: " + objectA.toString());// (2)使用构造方法创建实例。这就可以使用带参数的构造方法创建实例了Constructor[] cons = testClass.getDeclaredConstructors();System.out.println("testClass有 " + cons.length + " 个构造方法");Constructor con = null;for (int i = 0; i < cons.length; i++) {con = cons[i];// 默认构造函数if (con.getParameterTypes().length == 0) {// 调用Constructor的newInstance方法创建实例objectA = (TestClass) con.newInstance(null);System.out.println("Constructor 的 newInstance() 方法创建默认TestClass实例: " + objectA.toString());} else {// 带参数的构造函数objectA = (TestClass) con.newInstance(new Object[] {new Integer(55), new Integer(88) });System.out.println("Constructor 的 newInstance() 方法创建带参数的TestClass实例: " + objectA.toString());}}/** *** 获取方法 *** */// 获取所有方法Method[] methods = testClass.getMethods();// 获取某个特定的无参数的方法Method saddMethod1 = testClass.getMethod("sadd", null);Method addMethod1 = testClass.getMethod("add", null);// 获取某个特定的有参数的方法Method saddMethod2 = testClass.getMethod("sadd", new Class[] { int.class, int.class });Method addMethod2 = testClass.getMethod("add", new Class[] { int.class, int.class });/** *** 调用静态方法 **** */// 调用不带参数的静态方法int result = ((Integer) saddMethod1.invoke(null, null)).intValue();System.out.println("调用不带参数的静态方法sadd: " + result);// 调用带参数的静态方法result = ((Integer) saddMethod2.invoke(null, new Object[] { new Integer(30), new Integer(70) })).intValue();System.out.println("调用带参数30, 70的静态方法sadd: " + result);/** *** 调用实例方法 **** */objectA = (TestClass) testClass.newInstance();// 调用不带参数的实例方法result = ((Integer) addMethod1.invoke(objectA, null)).intValue();System.out.println("调用不带参数的实例方法add: " + result);// 调用带参数的实例方法result = ((Integer) addMethod2.invoke(objectA, new Object[] { new Integer(130), new Integer(170) })).intValue();System.out.println("调用带参数130, 170的实例方法add: " + result);// 不能访问私有方法// Method sub = testClass.getMethod("sub", null);// System.out.println(sub.invoke(objectA, null));}// 测试类static class TestClass {// 两个静态属性static int sa = 100;static int sb = 50;// 两个实例属性int a;int b;// 默认构造方法public TestClass() {this.a = 5;this.b = 10;}// 带参数的构造方法public TestClass(int a, int b) {this.a = a;this.b = b;}// 静态方法,实现add功能public static int sadd() {return sa + sb;}public static int sadd(int a, int b) {return a + b;}// 实例方法,实现add功能public int add() {return this.a + this.b;}public int add(int a, int b) {return a + b;}public String toString() {return "a = " + this.a + "; b = " + this.b;}// 私有方法private int sub() {return this.a - this.b;}}}


 

原创粉丝点击