java properties/反射基础
Properties
1.不使用Properties的普通方法
建立一个文件,然后用BufferReader读取,如图
这里用 FileReader 作为参数创建了一个 BufferedReader 对象,因为直接使用 BufferedReader
不能独立读取文件,因为它是依赖于一个字符流或者字节流来读取文件内容的。也就是说,BufferReader本身并不具备从磁盘中读取数据的能力,它需要借助 FileReader
(或者其他字符流)来进行文件的输入操作
BufferedReader
是 Java 中用于读取字符流的一个类,它提供了缓冲功能,能有效提高读取性能
FileReader
是 Java 中的一个字符输入流类,它主要用于从文件中读取字符数据(而非字节数据)
它是一个低级流,不具有缓冲区,直接从文件中读取数据。如果文件较大或频繁读取,会导致性能较差。因此,通常与 BufferedReader
结合使用,以提高性能。
但是只要数据一多,这种方法很麻烦,而且如果想要拿出来某一个值,那又得写if语句
2.介绍并使用Properties
使用properties修改文件
使用store创建时,null处对应的是备注
于是这里出现了一个mysql2.properties的文件并创建了输入值
再修改一下源代码,mysql2中的中的值也重新被修改了
底层源码
反射
反射的引入
反射(Reflection)是 Java 中的一种强大机制,它允许程序在运行时动态地查询和操作类、对象、方法、字段等信息。通过反射,Java 程序可以在运行时加载、探测、调用类中的方法,而不是在编译时就确定这些信息。
1.按照上图要求输入以下代码(过程中抛了很多异常)
但是,不可以像Cat cat2=new com.hspedu.Cat()这样创建对象!因为它是一个字符串
2.反射机制很重要,它可以通过调整配置文件,从而不需要修改源码来控制程序
这里的methodName就是前面的method,改了个名而已
其中返回Class类型的对象很重要,注意这里class是个类
java9以上的版本的newInstance()已过时,换成下面这种
Class cla=Class.forName(classfullpath);// 动态加载指定类,使用 classfullpath(类的全路径)
Object o = cla.getDeclaredConstructor().newInstance();
System.out.println(o.getClass().getName());// 输出对象实例的类名,确认对象是否成功创建
最终可以成功输出方法
如果把re.properties中的method换成别的方法,依旧可以不改源码直接调用
※反射的机制
1.
2.
※反射原理图
但我还不是特别理解,等学了jvm后来补充?
类加载器这个过程,就是体现反射的过程
3.主要类
constructor2处传入的String.class就是String类的class对象
4.优缺点
4.1传统方式
4.2反射方式
4.3可以看到时间差异
5.反射优化
5.1 在原有代码上加一个setAccessible(true)即可
5.2 m3是改良后的函数,可以看到是有作用的