一.properties
–Map
–HashTable
java.util.properties
1.使用所有Map的方法:用来保存键值对的
put
get
自己的方法
setProperty(String,String);
getProperty(String),返回值String
2.经常用来做配置信息
数据保存的方式:临时保存
数组
集合
持久保存:
文件
数据库
Properties能读取文件,读取的内容是文本,并且保存的数据是key-value形式的数据,并且根据key获得value
Jvm的配置信息也是Properties保存的
3.通过eclipse来添加JVM的运行参数和程序的运行参数
右键–>run as—>Run Configurations—>Arguments
4.创建一个文件
例:创建info.properties
5.读取文件需要的前置知识
数据的流向IO–>input output
Scanner,Programing,arguements,VM arguements—>输入–>程序–>输出–>控制台(cmd)
文件(txt,dll,properties,MP3,MP4,)–>程序—>文件
字符流只能读文本
字节流可以读所有
获取到文件的路径
绝对路径
相对路径
相关代码实现
public class PropertiesTest {
public static void main(String[] args) throws FileNotFoundException, IOException {
//获取JVM的配置信息保存在Properties里
Properties p = System.getProperties();
p.list(System.out);
System.out.println(p.getProperty("user.name"));
System.out.println(p.getProperty("os.name"));
System.out.println(p.getProperty("java.version"));
//JVM运行的系统参数可以通过外部进行添加
System.out.println(p.getProperty("name"));
//args是程序运行的系统参数
if(args.length>0) {
System.out.println(Arrays.toString(args));
//找到文件的路径
String path = "/JD2007Code/src/day15/info.properties";
// String path = "src/day15/info.properties";//相对路径
Properties p1 = new Properties();
p.load(new FileInputStream(new File(path)));
System.out.println("ming"+p1.getProperty("username"));
System.out.println("mima"+p1.getProperty("password"));
}
}
}
二.一个类是如何在内存中被使用(被加载)的
.class–>加载到内存的过程
加载—>连接—>初始化(main方法之前)
1.加载
.class加载进内存的过程
java.lang.Class(类的抽象的类)
现实生活中的事物–>抽象成–>class–>student–>再抽象—>
class Class(不是由程序员做的)
如何对一个类再jvm中做唯一标识?
包名+类名=全限类名
Student s1 = new Student();
Student s2 = new Student();
只会产生一个Class的实例
2.连接
验证:
分配空间:静态成员
解析功能:
info();//间接引用
0x1120231//直接引用
3.初始化
1.用到该类时进行初始化
产生该类的对象的时候
使用该类的静态成员(调用静态变量,静态方法)
使用该类子类的时候,父类也要跟着初始化
通过反射来创建实例的时候,Class.forName(全限类名);
…
初始化静态变量(显性的初始化,隐性的初始化),静态代码块,静态方法
静态成员的初始化是按照顺序从上到下初始化的
2.JVM强制提前对某些类进行初始化
在加载过程中,有程序帮助我们进行类加载
类加载器 ClassLoader
1.类加载器加载的类的来源
.class的来源
JDK中的来源
第三方jar包里的,框架里的
我们自己写的,classpath里的
网络上加载.class文件
2.类加载器的类型
根类加载器:BootstrapClassLoader(c++编写的)
其它类加载器(java实现的)都是ClassLoader的子类
扩展类加载器:ExtensionClassLoader
系统类加载器:SystemClassLoader
自己写一个类加载器必须继承ClassLoader
3.类加载器加载的范围
BootstrapClassLoader
提前加载JDK中的rt.jar,resourse
ExtensionClassLoader
为JDK添加一些功能拓展的jar包,jre/lib/ext 下面的所有jar包里的class
如果自己想对JDK做一些功能拓展,可以把自己写好的工具类的.class文件使用jar命令打成jar包,放在该目录下面
SystemClassLoader
我们自己写的.class文件,由classpath指定的目录下的所有class文件
4.类加载器之间是有一个子父关系的
该子父关系不是指继承关系,而是实例之间的父子关系
根
拓展
系统
5.类加载器工作的机制
全局加载,父类委托,缓存加载
6.使用类加载器加载类
===============================================================
三.反射
一个java程序分为编译阶段和运行阶段
例:Person p = new Student();
p的编译类型Person
p的运行类型Student
如果修改别人写的类,我们需要在运行阶段动态的获得该类的所有信息
我们通过反射产生的镜像对象拥有和原对象一样的属性和方法
镜像对象的属性就是原对象的属性
镜像对象可以获得原对象的所有方法,构造器,属性,实现的接口,继承的父类,添加的注解,使用的泛型
static int i=10;
class Filed{
String type = "int";
String name = "i";
int value = 10;
String[] modified = "static";
}
附:创建实例的过程
Teacher t = new Teacher();
1.在栈区开辟空间保存引用
2.在堆区开辟空间保存实际的数据
3.把堆区的内存地址赋值给栈区的引用
4.给变量赋默认值(系统)
5.给变量显示的赋初始值
6.给代码块进行初始化
7.通过对应的构造器来完成对象的创建
四.心得
今天上了一节原理课,并没具有写太多的代码,只是进行了少部分相关内容的代码实现,理解起来也不是很复杂,主要内容都是在给反射做铺垫,今天就写写那个学生管理系统,明天好好学反射.