反射的牛逼之处在哪里,为什么要使用反射?
举个简单清晰的例子
我们有一个类胡桃
我们要使用e方法,那就new对象,然后用e,是吧?
public class HuTao {
public void e(){
System.out.println("起");
}
public void q(){
System.out.println("再会咯");
}
public static void main(String[] args) {
HuTao huTao = new HuTao();
huTao.e();
}
但是,如果我要用q的话,是不是得改源码为
huTao.q();
那能不能通过外部文件配置,在不修改源码的情况下控制程序呢?
设计模式有个OCP原则(不修改源码,扩容功能)
这里就体现出反射的作用了
我们写一个配置文件,叫做re.properties,里面就写这么一句话(类路径)
classfullmath=fanShe.HuTao
接着类HuTao我们这样写
package fanShe;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;
public class HuTao {
public void e(){
System.out.println("起");
}
public void q(){
System.out.println("再会咯");
}
public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
Properties properties = new Properties();
//Properties类可以读取配置文件,new一个Properties对象
properties.load(new FileInputStream("src\\re.properties"));//获取配置文件路径
String className=properties.get("classfullmath").toString();//把类名字拿到
String methodName=properties.get("method").toString();//把方法名字拿到
Class<?> aClass = Class.forName(className);//根据类名字加载类
Object o = aClass.newInstance();//获得类对象实例
Method method=aClass.getMethod(methodName);//获得方法对象
method.invoke(o);//反射使用方法的方式很神奇,用方法.对象
}
}
比如我们想用e方法,不用修改源码,只需要在配置文件里再加一句话
method=e
我们想用q方法,改成
method=q
当然,这只是引出反射很小的一个例子,反射的强大和作用远远不止这些。