zoukankan      html  css  js  c++  java
  • 基础加强____【反射的作用__实现框架功能】



    在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();
    		//反射方式体现的好处:可以不修改源码,而是通过修改配置文件来修改程序
    


  • 相关阅读:
    junit单元测试
    方法引用
    方法引用表达式(1)
    Stream流的常用方法
    Stream流
    综合案例:文件上传
    tcp通信协议
    python 生成器与迭代器
    Python 序列化与反序列化
    python 文件操作
  • 原文地址:https://www.cnblogs.com/Joure/p/4337191.html
Copyright © 2011-2022 走看看