致谢@how2Java,详细内容看原文地址:
http://how2j.cn/k/reflection/reflection-usage/1111.html?p=36217
Java反射可能很多人已经有了一定的了解和接触,但有的同学有疑问了,就单纯的拿自己编写程序的经验来说,使用反射好像还不及自己直接调用方法属性来的快,为什么要用反射?
在此通过实例说明反射的优越之处,相信大家看了以后也会对spring有更好的理解。
1.新建两个业务类
package com.cqu.someTest1;
public class Service1 {
public void doService1(){
System.out.println("业务方法1");
}
}
package com.cqu.someTest1;
public class Service2 {
public void doService2(){
System.out.println("业务方法2");
}
}
2.采用非反射的方法
此时,如果我们需要从第一个业务方法切换到第二个业务方法,就需要修改代码,重新编译。
package com.cqu.someTest1;
public class Test {
public static void main(String[] args) {
// new Service1().doService1();
new Service2().doService2();
}
}
3.采用反射的方式
先准备一个配置文件:spring.txt
class=com.cqu.someTest1.Service1
method=doService1
里面存放的是类的名称,和要调用的方法名。
在测试类Test中,首先取出类名称和方法名,然后通过反射去调用这个方法。
当需要从调用第一个业务方法,切换到调用第二个业务方法的时候,不需要修改一行代码,也不需要重新编译,只需要修改配置文件spring.txt,再运行即可。
这也是Spring框架的最基本的原理,只是它做的更丰富,安全,健壮。
Test.java源码:
package com.cqu.someTest1;
import java.io.File;
import java.io.FileInputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Properties;
public class Test {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args) throws Exception {
//从spring.txt中获取类名称和方法名称
File springConfigFile = new File("D:\\my_project\\java_project\\Test\\src\\com\\cqu\\resources\\spring.txt");
Properties springConfig= new Properties();
springConfig.load(new FileInputStream(springConfigFile));
String className = (String) springConfig.get("class");
String methodName = (String) springConfig.get("method");
//根据类名称获取类对象
Class clazz = Class.forName(className);
//根据方法名称,获取方法对象
Method m = clazz.getMethod(methodName);
//获取构造器
Constructor c = clazz.getConstructor();
//根据构造器,实例化出对象
Object service = c.newInstance();
//调用对象的指定方法
m.invoke(service);
}
}