• 框架与框架要解决的核心问题
    • 我们做房子卖给用户住,用于用户自己安装门窗和空调,我做的房子就是框架,用户需要使用我的框架,把门窗插入进我提供的框架中。框架与工具类有区别,工具类被用户的类调用,而框架则是调用用户提供的类。
  • 框架要解决的核心问题
    • 我在写框架(房子)时,你这个用户可能还在上小学,还不会写程序呢?我写的框架程序怎样能调用到你以后写的类呢?

Class.forName(classNameStr).getMethod(methodName).invoke(obj,Class)

    • 因为在写程序时无法知道要被调用的类名,所以,在程序中无法直接new某个类的实例对象了,而要用反射方式来做。
  • 综合案例
    • 先直接用new语句创建ArrayList和HashSet的实例对象,演示用eclipse自动生成ReflectPoint类的equals和hashCode方法,

比较两个集合的运行结果差异。

    • 然后改为采用配置文件加载反射的方式创建ArrayList和HashSet的实例对象,比较观察运行结果差异。
    • 引入了eclpse对资源文件的管理方式的讲解。
  • Properties类
    • Properties对象就等效于一个HashMap,内存里装的是<key,value><key,value><key,value>
    • 在HashMap的基础上扩展了一些功能,
      • ①可以把内存里的键值对存到硬盘里面
      • ② 可以在初始化时把文件里的键值对加载进properties对象里来。
package com.itcast.day1;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Collection;
import java.util.HashSet;
import java.util.Properties;
import java.util.ArrayList;
public class ReflectTest3 {
public static void main(String[] args)throws Exception {
InputStream ips = new FileInputStream("config.properties");
Properties props=new Properties();
props.load(ips);//1 硬盘加载到内存 ,2从内存中加载到props对象中
ips.close();//关闭是指释放ips加载的资源,ips对象不会随着close方法的执行而被JVM回收如果不关闭,则有小小的内存泄露 。
String className= props.getProperty("className");
System.out.println(className);
Collection collections=(Collection)Class.forName(className).newInstance(); ReflectPoint pt1=new ReflectPoint(3,3);
collections.add(pt1);//放入
}
}

config.properties文件放在哪里呢?

相对当前工作路径,在实际项目中,几乎没有这么干的!

实际项目一定要用绝对路径,但绝对路径不是硬编码!

实际项目中应当:

config.properties文件在硬盘上的存放位置由用户指定,用户可配置“主目录”/config.properties。

getRealPath();// 主目录/config.properties

  • 类加载器--ClassLoader

类加载器通常用来加载  *.class文件,既然 .class文件都可以加载进来(强大!),那么加载其他配置文件,岂不是小菜一碟!就看愿不愿意加载了。

RefectTest3.class.geteClassLoader().getResourceAsStream()//适用于只读配置文件时

框架的配置文件都放在类路径下,原因是框架内部读取配置文件都是在采用类加载器加载方式,而类加载器加载文件时会从类路径下查找。

    • 类加载器加载config.properties其中config.propertis存放在类路径下
package com.itcast.day1;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.Collection;
import java.util.Properties;
public class ReflectTest3 {
public static void main(String[] args)throws Exception {
//在类路径下找文件,转换成输入流
InputStream ips=null;
// ips=ReflectTest3.class.getClassLoader().getResourceAsStream
// ("com"+File.separator+"itcast"+File.separator+"day1"+File.separator+"config.properties");
// ips=ReflectTest3.class.getResourceAsStream("config.properties");//在本包下找
//Class提供了一种更简洁的方式来加载配置文件(和class.newInstance方法省略了得到构造器类似),在类路径的根目录下开始找
ips=ReflectTest3.class.getResourceAsStream
("/"+"com"+File.separator+"itcast"+File.separator+"day1"+File.separator+"config.properties"); Properties props=new Properties();
props.load(ips);//1 硬盘加载到内存 ,2从内存中加载到props对象中
ips.close();//关闭是指释放ips加载的资源,ips对象不会随着close方法的执行而被JVM回收如果不关闭,则有小小的内存泄露 。
String className= props.getProperty("className");
System.out.println(className); Collection collections=(Collection)Class.forName(className).newInstance();
ReflectPoint pt1=new ReflectPoint(3,3);
collections.add(pt1);//放入 System.out.println(collections.size());
}
}
 

反射的作用—>实现框架的功能的更多相关文章

  1. JAVA 利用反射自定义数据层框架

    之前的随笔一直都在介绍c#,主要公司最近的业务都是做桌面程序,那么目前c#中的WPF肯定是我做桌面程序的不二之选,做了半年的WPF,也基本摸清了c#写代码的套路和规则(本人之前是两年多的JAVA开发者 ...

  2. 【iOS】7.4 定位服务->2.1.3.1 定位 - 官方框架CoreLocation 功能1:地理定位

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  3. 【iOS】7.4 定位服务->3.4 地图框架MapKit 功能4:地图截图

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  4. 工作流引擎Activiti使用进阶!详细解析工作流框架中高级功能的使用示例

    Activiti高级功能简介 Activit的高级用例,会超越BPMN 2.0流程的范畴,使用Activiti高级功能需要有Activiti开发的明确目标和足够的Activiti开发经验 监听流程解析 ...

  5. 移动app框架inoic功能研究

    原生移动app框架inoic功能研究 本篇只侧重框架提供的功能和能力的研究,请关注后续实际部署使用体验. 一.inoic是什么? inoic是一个可以使用Web技术以hybird方式开发移动app的前 ...

  6. 【iOS】7.4 定位服务->2.1.3.2 定位 - 官方框架CoreLocation 功能2:地理编码和反地理编码

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  7. 【iOS】7.4 定位服务->2.1.3.3 定位 - 官方框架CoreLocation 功能3:区域监听

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  8. 【iOS】7.4 定位服务->3.1 地图框架MapKit 功能1:地图展示

    > 本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. --- > 本文相关目录: ================== 所属文集:[[ ...

  9. 【iOS】7.4 定位服务->3.2 地图框架MapKit 功能2:路线规划(导航)

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

随机推荐

  1. gitlab ssh_key

    ubuntu下生成git的密钥 1 生成ssh key 执行 命令 ssh-keygen -t rsa -C “wangwei@**.com.cn” 邮箱根据自己实际修改,一直回车 2 查看生成的密钥 ...

  2. [深度学习] 最全优化方法总结比较--SGD,Adagrad,Adadelta,Adam,Adamax,Nadam

    SGD 此处的SGD指mini-batch gradient descent,关于batch gradient descent, stochastic gradient descent, 以及 min ...

  3. MySQL多表查询练习题

    一.准备数据 #创建表及插入记录 CREATE TABLE class ( cid ) NOT NULL AUTO_INCREMENT, caption ) NOT NULL, PRIMARY KEY ...

  4. 使用Git Extensions简单入门Git

    前言 关于这个主题,之前我录了段视频教程,在本地看清晰度还可以,但传到优酷上就很不清晰了,即使是后来重制后还是一样不清晰,所以现在想整理成文字版.当然,大家还可以将我百度云上的视频下载下来观看,连同优 ...

  5. 菜鸟入门【ASP.NET Core】12:JWT 设计解析及定制

    前言 上一节我们讲述的书如何使用jwt token,而且上一节的token是要加Authorization:bearer XXXXXXXXXXXX才能访问. 这一节我们来研究如何自定义类似jwt的to ...

  6. nexus-3.2.0-01.zip安装以及如何启动服务

    1. 在之前的版本中,启动nexus服务都是在cmd中输入 nexus install来安装服务,nexus start来启动服务. 2. 在nexus-3.2.0-01中,直接在nexus根目录下的 ...

  7. JAVA对Excel的导入导出

    今天需要对比2个excel表的内容找出相同:由于要学的还很多上手很慢所以在这做个分享希望对初学的有帮助: 先是pom的配置: <dependency> <groupId>org ...

  8. Java中变量之局部变量、本类成员变量、父类成员变量的访问方法

    变量:局部变量.本类成员变量.父类成员变量 如何访问:如果变量名相同,则采用就近原则,哪个变量离所要调用的访问最近,那就么就输出,优先顺序为:局部变量 > 本类成员变量 > 父类成员变量 ...

  9. SVN多项目并行版本管理解决方案

    1.背景 随着公司业务拓展,各业务部门频繁的需求变更,导致系统集成冲突的问题日益突出. 2.现状 基于SVN版本管理模式,多分支版本并行,分支合并主干交付.多分支开发存在依赖关系且有交付的先后顺序, ...

  10. inheritCombination.js

    // 组合继承 // 其基本思路是使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承 function Person(name){ this.name = name; th ...