在java主流的开源框架中都应用了反射技术,学习反射能让我们加深对这些框架的理解,如果有能力也可以做出自己的功能框架
反射的作用: "实现框架功能" 框架与工具类的区别:工具类被用户提供的类调用,框架是调用用户提供的类 如果用户的类相当于一扇门,框架相当于房子,工具类相当于门上的锁。 框架要解决的问题:不知道用户提供的类名,所以在程序中无法直接new出某个类的实例对象,而要通过反射来做 案例:ReflectTest2 创建ArrayList 与HashSet的实例,比较差异 然后改为配置文件加反射的方式创建对象,比较差异 反射的好处:可以不修改源码,而是通过修改配置文件来修改程序,这也是框架功能的体现 了解eclipse对资源文件的管理方式,分清"相对路径"和"绝对路径" eclipse会将工程中src目录下.java文件编译成.class文件生成到classPath(bin)目录下,将其他文件直接copy到bin目录 而系统在运行时调用的配置文件是在classPath目录下查找 配置文件 //路径:getRealPath(); 获取完整(相对)路径 要使用完整的路径,但完整的路径不是硬编码,而是运算出来的 加载配置文件(config.properties)的方式: 1)用IO流加载 InputStream 2)用"类加载器"加载文件 InputStream fis = .class.getClassLoader().getResourceAsStream("classPath")//绝对路径 java中的类是通过类加载器加载class字节码进内存来运行的;类加载器既然可以加载class文件, 加载普通文件当然也是可以的,该方式以只读的方式来加载配置文件,因为没有对应的OutputStream方法 在框架中都是以类加载器的方式来加载配置文件,所以配置文件必须放在classPath目录下 类加载器方式在框架中是一种比较通用的方式, 3)/使用class的简便方法(在底层调用了类加载器),即可使用相对路径,又可使用绝对路径 InputStream fis = .class.getResourceAsStream("classPath");//相对路径 配置文件加载进内存后使用properties类进行操作 new Properties().load(fis);
创建配置文件,通过eclipse在工程中new一个 properties后缀的File即可
在配置文件中把想要操作的类以 name = value的形式存入;如className=java.util.HashSet
加载配置文件的代码实现
/* 从配置文件加载类名路径:可以通过getRealPath(); 获取完整(相对)路径 要使用完整的路径,但完整的路径不是硬编码,而是运算出来的 一、使用普通IO方法的好处是能够有对应的OutputStream, 可以保存配置文件 InputStream fis = new FileInputStream("config.properties"); */ /* 二、使用类加载器加载配置文件,加载的数据类型为InputStream,只读,没有对应的OutputStream InputStream fis = ReflectTest2.class.getClassLoader() .getResourceAsStream("itheima/enhance/config.properties");//绝对路径 */ //三、使用class的简便方法(在底层调用了类加载器),即可使用相对路径,又可使用绝对路径 InputStream fis = ReflectTest2.class.getResourceAsStream("resource/config.properties");//相对路径 Properties prop = new Properties(); prop.load(fis); //将prop与输入流关联 fis.close(); //关闭资源 String className = prop.getProperty("className");//获取类名 //反射方式创建对象,要转型 Collection collections = (Collection)Class.forName(className).newInstance(); //反射方式体现的好处:可以不修改源码,而是通过修改配置文件来修改程序