反射在Spring IOC容器中的应用——动态创建Bean (补充)
在上文中,讲述了反射在Spring IOC容器中的应用,即通过获取类的class对象后进行实例化,用实例化对象去操作其中的成员(变量,方法等),今天来补充一下反射实现动态调用。
一句话讲,就是:通过获取 Class 对象并实例化,再根据配置文件动态调用方法的过程,就是“动态调用”
还是老样子,举例讲解:
准备方法:
public class TestInvoke {public void sayHello() {System.out.println("欢迎使用!正在执行 sayHello 方法。");}public void sayBye() {System.out.println("再见!正在执行 sayBye 方法。");}public void doWork() {System.out.println("正在处理任务... 执行 doWork 方法。");}
}
配置文件(使用时只会给一个配置取消注释,即激活):
# 场景1:调用 sayHello
className=TestInvoke
methodName=sayHello# 场景2:调用 sayBye
# className=TestInvoke
# methodName=sayBye# 场景3:调用 doWork
# className=TestInvoke
# methodName=doWork
核心执行代码:
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {// 1. 获取类名并加载 Class 对象Class<?> c = Class.forName(getName("className"));System.out.println("加载的类名:" + c.getSimpleName());// 2. 获取方法名并获取 Method 对象Method method = c.getDeclaredMethod(getName("methodName"));// 3. 绕过访问控制检查(可选)method.setAccessible(true);// 4. 创建实例对象TestInvoke testInvoke = (TestInvoke) c.newInstance();// 5. 调用方法method.invoke(testInvoke);
}
运行实例:
示例1:调用 sayHello()
配置文件内容:
className=TestInvoke
methodName=sayHello
程序输出:
加载的类名:TestInvoke
欢迎使用!正在执行 sayHello 方法。
总结一下: