反射的作用—>实现框架的功能
- 框架与框架要解决的核心问题
- 我们做房子卖给用户住,用于用户自己安装门窗和空调,我做的房子就是框架,用户需要使用我的框架,把门窗插入进我提供的框架中。框架与工具类有区别,工具类被用户的类调用,而框架则是调用用户提供的类。
- 框架要解决的核心问题
- 我在写框架(房子)时,你这个用户可能还在上小学,还不会写程序呢?我写的框架程序怎样能调用到你以后写的类呢?
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());
}
}
反射的作用—>实现框架的功能的更多相关文章
- JAVA 利用反射自定义数据层框架
之前的随笔一直都在介绍c#,主要公司最近的业务都是做桌面程序,那么目前c#中的WPF肯定是我做桌面程序的不二之选,做了半年的WPF,也基本摸清了c#写代码的套路和规则(本人之前是两年多的JAVA开发者 ...
- 【iOS】7.4 定位服务->2.1.3.1 定位 - 官方框架CoreLocation 功能1:地理定位
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- 【iOS】7.4 定位服务->3.4 地图框架MapKit 功能4:地图截图
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- 工作流引擎Activiti使用进阶!详细解析工作流框架中高级功能的使用示例
Activiti高级功能简介 Activit的高级用例,会超越BPMN 2.0流程的范畴,使用Activiti高级功能需要有Activiti开发的明确目标和足够的Activiti开发经验 监听流程解析 ...
- 移动app框架inoic功能研究
原生移动app框架inoic功能研究 本篇只侧重框架提供的功能和能力的研究,请关注后续实际部署使用体验. 一.inoic是什么? inoic是一个可以使用Web技术以hybird方式开发移动app的前 ...
- 【iOS】7.4 定位服务->2.1.3.2 定位 - 官方框架CoreLocation 功能2:地理编码和反地理编码
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- 【iOS】7.4 定位服务->2.1.3.3 定位 - 官方框架CoreLocation 功能3:区域监听
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- 【iOS】7.4 定位服务->3.1 地图框架MapKit 功能1:地图展示
> 本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. --- > 本文相关目录: ================== 所属文集:[[ ...
- 【iOS】7.4 定位服务->3.2 地图框架MapKit 功能2:路线规划(导航)
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
随机推荐
- 二、Windows下TortoiseGit的安装与配置
TortoiseGit 简称 tgit, 中文名海龟Git. 海龟Git只支持神器 Windows 系统, 有一个前辈海龟SVN, TortoiseSVN和TortoiseGit都是非常优秀的开源的版 ...
- BizTalk 2010/2013 EDI B2B项目实践(1)
BizTalk 2010/2013 EDI B2B项目实践(1) BizTalk开发标准EDI B2B是件非常容易的事情,但对于初学者可能有很多专业术语不太理解,不知道如何下手,我之前开始学的时候虽然 ...
- Django models 常用数据类型
CharField class CharField(max_length=None[, **options]) # 字符串(存储从小到大各种长度) # 如果是巨大的文本类型,可以用 TextField ...
- [牛客小白月赛4 H] 相邻的糖果
Description 有n个盒子摆成一排,每个盒子内都有ai个糖果. 现在你可以执行以下操作: ·你可以选择任意一个盒子,在选择的盒子内吃掉一个糖果. 对你的要求如下: ·任何m个相邻的盒子内糖果数 ...
- .net core Identity集成IdentityServer4 (1)基本操作
一. 新建asp.net core identity项目 新建项目->asp.net core web应用程序-> web应用程序(模型视图控制器)&更改身份验证为个人. 新建一个 ...
- jQuery 获取对象 根据属性、内容匹配, 还有表单元素匹配
指定元素中包含 id 属性的, 如: $("span[id]") 代码如下: <span id="span1" name="S1"&g ...
- ubuntu16.04LTS更换阿里源
ubuntu16.04LTS更换阿里源 sudo gedit /etc/apt/sources.list 替换: # deb cdrom:[Ubuntu 16.04 LTS _Xenial Xe ...
- vsftpd-基于ftp协议的文件传输服务器软件
第一部分:在Linux上部署vsftpd服务 1. vsftpd简介 1.1 vsftpd是什么? ftp(File Transfer Protocol)文件传输协议.(实现不同操作系统之间文件的传输 ...
- CSS3背景色透明(兼容IE8)
标准浏览器通过rgba()实现背景色透明;IE8以下浏览器通过特有滤镜实现背景色透明. 代码如下: 1 /* IE8 */ 2 filter:progid:DXImageTransform.Micro ...
- blfs(systemv版本)学习笔记-配置远程连接显示中文
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 远程连接的lfs系统需要具备以下环境便可在xshell或其他远程终端上面显示中文: 1.lfs主机设置中文编码(需要配置) 2. ...
