反射的作用—>实现框架的功能
- 框架与框架要解决的核心问题
- 我们做房子卖给用户住,用于用户自己安装门窗和空调,我做的房子就是框架,用户需要使用我的框架,把门窗插入进我提供的框架中。框架与工具类有区别,工具类被用户的类调用,而框架则是调用用户提供的类。
- 框架要解决的核心问题
- 我在写框架(房子)时,你这个用户可能还在上小学,还不会写程序呢?我写的框架程序怎样能调用到你以后写的类呢?
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 设备工具 === ...
随机推荐
- .NET内存管理、垃圾回收
1. Stack和Heap 每个线程对应一个stack,线程创建的时候CLR为其创建这个stack,stack主要作用是记录函数的执行情况.值类型变量(函数的参数.局部变量 等非成员变量)都分配 ...
- 记录线上与本地docker镜像一致,但Dockerfile却构建失败的问题
背景 公司新开了某个项目,我在新的服务器部署了docker环境,本着ctrl+c 和ctrl+v的惯例,直接把以前的php环境的Dockerfile文件直接复制到新项目服务器那里,结果构建失败,失败的 ...
- 【翻译】WPF4.5新特性(MSDN的翻译读不太懂)
我很在意WPF的发展,有人说微软不再维护WPF了,无所谓,随他去. MSDN上有简体版:http://msdn.microsoft.com/zh-cn/library/vstudio/bb613588 ...
- Hyperledger Fabric密码模块系列之BCCSP(三)
fabric中通过工厂模式来生成bccsp实例,进而通过bccsp的接口来提供加密.解密.签名验证以及哈希等操作. fabric的factory工厂默认返回的bccsp实例是sw(也就是所有密码操作都 ...
- [PHP] 算法-合并两个有序链表为一个有序链表的PHP实现
合并两个有序的链表为一个有序的链表: 类似归并排序中合并两个数组的部分 1.遍历链表1和链表2,比较链表1和2中的元素大小 2.如果链表1结点大于链表2的结点,该结点放入第三方链表 3.链表1往下走一 ...
- [日常] Go语言圣经-字节切片与字符串
1.一个字符串是一个不可改变的字节序列2.文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列3.内置的len函数可以返回一个字符串中的字节数目4.第i个字节并不一定是字符串的第 ...
- Android基础系列合集
四大组件 1.Service Android四大组件-Service Android-远程Service Service 动态更新 UI 2.Activity Android四大组件-Activity ...
- 10个最佳ES6特性
译者按: 人生苦短,我用ES6. 原文: Top 10 ES6 Features Every Busy JavaScript Developer Must Know 译者: Fundebug 为了保证 ...
- python基础之数据的三大结构
python的三大数据结构 1.顺序 2.分支 3.循环 # if语句联系# 如果age小于18岁,则打印信息“未成年”age = 17if age <= 18: print("未成年 ...
- 【代码笔记】Web-HTML-头部
代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <!--ti ...
