// 统一调用成员方法
public class D {
// 构造函数1
public void func1() {
System.out.println("this is func1");
}
// 构造函数2
public void func2(Integer m) {
System.out.println("this is func2:" + m);
}
// 构造函数3
public void func3(String str, Integer m) {
System.out.println("this is func3:" + str + m);
}
static boolean process(String className, String funcName, Object[] para) throws Exception {
// 获取类信息对象
Class classInfo = Class.forName(className);
// 形成函数参数序列
Class c[] = new Class[para.length];
for (int i = 0; i < para.length; i++) {
c[i] = para[i].getClass();
}
// 调用无参数构造函数
Object obj = classInfo.getConstructor().newInstance();
// 获得函数方法信息
Method method = classInfo.getMethod(funcName, c);
// 执行该方法
method.invoke(obj, para);
return true;
}
// 第二种方式
// 通过class类的有参getConstructor方法,来获得对应的一个构造方法信息,然后调用newInstance方法,完成该实例的创建过程。
public static void main(String[] args) throws Exception {
Boolean flg3 = process("com.reflect.testPackage1.D", "func3", new Object[] { "strstrstrstr", 250 });
Boolean flg2 = process("com.reflect.testPackage1.D", "func2", new Object[] { 250 });
Boolean flg1 = process("com.reflect.testPackage1.D", "func1", new Object[] {});
System.out.println("process do success");
}
}
只要知道类名称字符串,方法名称字符串,方法参数值,就可以运用反射机制调用该方法。
通过该段程序,可以看到反射机制的特点是:可以把类名,方法名作为字符串变量,直接对这两个字符串变量进行操作,就能产生实例及相应的运行方法,这与普通的先new再直接调用所需方法有本质的不同。