Java反射

致谢@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);
         
    }
}

你可能感兴趣的:(Java反射)