package com.javase.reflect; import com.javase.bean.User; import java.util.ResourceBundle; /** * 验证反射机制的灵活性: * java代码写一遍,在不改变java源代码的基础之上,只需简单需改属性配置文件中的内容,就可以做到对不同对象的实例化。 * 非常灵活。符合OCP原则:对扩展开放,对修改关闭后期我们要学习高级框架,这些高级框架的底层实现原理都采用了反射机制, * 所以反射机制还是很重要的。 * * 学会了反射机制有利于理解剖析框架底层源代码。 */ public class ReflectText03 { public static void main(String[] args) { //下行代码就不灵活,比较死板,只能创建一个User类型的对象 User user = new User(); //以下代码就比较灵活,代码不需要改动,通过修改配置文件,就可以创建出不同的实例对象。 /* //第一种方式:通过IO流读取"info.properties"文件 属性配置文件在IDEA中所处的目录结构如图一 //首先获取配置文件的绝对路径 String path = Thread.currentThread().getContextClassLoader().getResource("info.properties").getPath(); //创建Properties集合 Properties pro = new Properties(); //创建输入流对象(这里创建的是字符输入流,也可以创建字节输入流) FileReader reader = null; try { reader = new FileReader(path); //加载 pro.load(reader); //通过key获取value String className = pro.getProperty("className"); System.out.println(className); //通过反射机制实例化对象 Class c = Class.forName(className); Object obj = c.newInstance(); System.out.println(obj); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); }finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } */ //第二种方式:通过资源绑定器获取属性配置文件的内容(该方式代码明显比第一种方式简单) ResourceBundle bundle = ResourceBundle.getBundle("info"); //小括号中的资源文件必须省略扩展名.properties //通过key获取value String className = bundle.getString("className"); //输出获取的value System.out.println(className); try { //通过反射机制实例化对象 Class c = Class.forName(className); Object obj = c.newInstance(); //输出创建的对象 System.out.println(obj); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } } } 图一 /* 程序运行结果: com.javase.bean.User com.javase.bean.User@1e80bfe8 */
验证反射机制的灵活性(符合OCP原则,对修改关闭,对扩展开放)
于 2023-01-02 14:47:00 首次发布