1.今天学到了一个新东西:在反射机制中用Properties。
2.先介绍一下Properties:
1)最先用到Properties,是之前在学习IO流的时候,IO+Properties的联合应用。
先看一下Properties在API里的介绍:
这里能对Properties有一个初步的理解,好像就是说,Properties是一个Map集合,有一个key和一个value,key和value都是String类型。
再举个实例理解一下:
1)先创建一个properties文件(如下图):
username=lihua
password=123456
- 这里用到了配置文件:所谓配置文件就是说:对于以后经常改变的数据,可以单独写到一个文件中,使用程序动态读取,将来只需要修改这个文件的内容,java代码不需要改动,不需要重新编译,服务器也不需要重启,就可以拿到动态的信息。类似于以上机制的这种文件被称为配置文件,并且当配置文件中的内容格式是:
key1=value1;key2=value2;
的时候,我们把这种配置文件叫做属性配置文件。 - java中属性配置文件建议以properties结尾,但这不是必须的。而所有以properties结尾的文件在java中都被称为:属性配置文件。其中Properties是专门存放属性配置文件内容的一个类。
- 在属性配置文件中注释是#,属性配置文件的key重复的话,value会自动覆盖。
- username : admin(这样写也可以,但不建议这样写),各符号之间最好不要有空格
2)将IO和Properties用在一起:
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
public class IOProperties {
public static void main(String[] args) throws IOException {
//新建一个输入流对象
FileReader fr=new FileReader("D:\\ideaProjects\\javacode\\projects\\src\\com\\java\\note\\userinfo.properties");
//新建一个Properties集合
Properties pro=new Properties();
//调用properties对象的Load方法,将userinfo文件中的数据加载到Properties集合当中去
pro.load(fr);
// 文件中的数据顺管道加载到Properties集合中,其中等号左边做key,右边做value
fr.close();
System.out.println(pro.getProperty("username"));
System.out.println(pro.getProperty("password"));
}
}
运行结果:lihua 123456
3.在反射机制中用Properties
1)先创建一个classinfo配置文件,用来存放className,像下面这样:
2)验证反射机制灵活性
import java.io.FileReader;
import java.util.Properties;
public class ReflectTest02 {
public static void main(String[] args) throws Exception{
FileReader fil = new FileReader("D:\\ideaProjects\\javacode\\projects\\src\\com\\java\\note\\classinfo.properties");
//properties文件所在的绝对路径
Properties pro=new Properties();
pro.load(fil);
fil.close();
//通过key获value
String className=pro.getProperty("className");
System.out.println(className);//输出:java.util.Date,说明创建类成功
//再通过反射机制实例化对象
Class c=Class.forName(className);
Object obj=c.newInstance();
System.out.println(obj);
}
}
运行结果:
java.util.Date
Sat Jul 22 13:38:24 CST 2023
如果把classinfo文件里的value改一下,改成自己编写的User类,像这样:
产生的运行结果:
com.java.note.User
无参数构造方法 !
com.java.note.User@4554617c
感觉悟到了一点点OCP开闭原则(对扩展开放,对修改关闭),这样写就非常灵活,在不改变java源代码的基础之上,可以做到对不同对象的实例化