反射写框架和配置文件的读取:框架实际上是在调用我们写的类。框架就是个房子,每个人装饰不一样。比自己造个房子效率高!框架要考虑调用我们将要写的一些类,还不存在的类,只能用Class.forName(“运行期间传入类名”)。不能存在具体类名,应当从配置文件中读取!处理不同的类,只需修改配置文件!
在项目根目录下new fold 名字:config.properties
内容:classname=java.util.ArrayList
class Test{
main(){
FileInputStream fis=new FileInputStream(“config.properties”);
Properties p=new Properties();
//读入键值对
p.load(fis);
fis.close();
//获取键值对,key为classname的value
String className=p.getProperty(“classname”);
强制转化:
Collection c=( Collection)Class.forName(className).newInstance();
}
当我们完成项目时,只会把编译后的.class文件打包,发给用户,要保证配置文件也在包内以及正确的目录下!!
1config.properties现在是相对路径,不太好,一般是又用户指定配置文件位置,设置为绝对路径,但不是硬编码,是运行时动态生成
2解决2:类加载器将.class文件加载到内存,是去classpath路径下去加载,也可以把其他文件加载到内存,只需将配置文件config.properties直接copy到src/的包下和源文件放在一起! Myeclipse会自动将config.properties文件原封不动的copy到bin对应包下,路径不变
上面代码改成:
//去classpath路径下,获取文件流,getResourceAsStream()默认是从根目录去找文件,所以要加包名,相对对路径最前面不要加斜杠!/com/bj/reflex/config.properties,错误!,本来就是根目录!
1FileInputStream fis =
Test.class.getClassLoader().getResourceAsStream(“com/bj/reflex/config.properties”);
或
2Test.class .getResourceAsStream(“config.properties”);
Class对象也有getResourceAsStream方法,默认从该.class文件下找
借用类加载器获取文件流
如果为资源文件配置文件,单独建个包,放在com/bj/reflex/resource 子包下
Test.class .getResourceAsStream(“resource/config.properties”); ok
以上很多框架的实现方式,所以讲配置文件放在classpath下
|
|