框架-用户类-工具类:框架与工具类有区别,工具类被用户的类调用,而框架则是调用用户提供的类。
框架要解决的核心问题:框架如何调用未知的类:通过反射来实现
综合案例: 使用配置文件读取调用类的名字
工程目录
ReflectTest测试类
1
package com.ljq.test;
2
3 import java.io.FileInputStream;
4 import java.io.InputStream;
5 import java.util.Collection;
6 import java.util.Properties;
7
8 /* *
9 * 使用配置文件读取调用者的类
10 *
11 * @author jiqinlin
12 *
13 */
14 public class ReflectTest {
15 public static void main(String[] args) throws Exception{
16 // 使用绝对路径,否则无法读取config.properties
17 // InputStream inStream=new FileInputStream("F:\\android\\test\\src\\com\\ljq\\test\\resource\\config.properties");
18
19 // ReflectTest.class.getClassLoader().getResourceAsStream(String path): 默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。
20 // InputStream inStream = ReflectTest.class.getClassLoader().getResourceAsStream("com/ljq/test/resource/config.properties");
21
22 // ReflectTest.class.getResourceAsStream(String path): path不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。
23 // 其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。
24 // InputStream inStream = ReflectTest.class.getResourceAsStream("/com/ljq/test/resource/config.properties");
25
26 // config.properties配置文件所在目录是ReflectTest类所在子目录,才可以;否则报空指针异常
27 InputStream inStream = ReflectTest. class .getResourceAsStream( " resource/config.properties " );
28
29 Properties props = new Properties();
30 props.load(inStream);
31 inStream.close();
32
33 String className = props.getProperty( " className " );
34 Collection collection = (Collection)Class.forName(className).newInstance();
35 collection.add( " 123 " );
36 System. out .println( " size= " + collection.size()); // size=1
37 }
38 }
2
3 import java.io.FileInputStream;
4 import java.io.InputStream;
5 import java.util.Collection;
6 import java.util.Properties;
7
8 /* *
9 * 使用配置文件读取调用者的类
10 *
11 * @author jiqinlin
12 *
13 */
14 public class ReflectTest {
15 public static void main(String[] args) throws Exception{
16 // 使用绝对路径,否则无法读取config.properties
17 // InputStream inStream=new FileInputStream("F:\\android\\test\\src\\com\\ljq\\test\\resource\\config.properties");
18
19 // ReflectTest.class.getClassLoader().getResourceAsStream(String path): 默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。
20 // InputStream inStream = ReflectTest.class.getClassLoader().getResourceAsStream("com/ljq/test/resource/config.properties");
21
22 // ReflectTest.class.getResourceAsStream(String path): path不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。
23 // 其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。
24 // InputStream inStream = ReflectTest.class.getResourceAsStream("/com/ljq/test/resource/config.properties");
25
26 // config.properties配置文件所在目录是ReflectTest类所在子目录,才可以;否则报空指针异常
27 InputStream inStream = ReflectTest. class .getResourceAsStream( " resource/config.properties " );
28
29 Properties props = new Properties();
30 props.load(inStream);
31 inStream.close();
32
33 String className = props.getProperty( " className " );
34 Collection collection = (Collection)Class.forName(className).newInstance();
35 collection.add( " 123 " );
36 System. out .println( " size= " + collection.size()); // size=1
37 }
38 }
config.properties配置文件
className
=
java.util.HashSet
getResourceAsStream用法大致有以下几种:
1
第一:要加载的文件和.class文件在同一目录下,例如:com.ljq.test目录下有类ReflectTest.
class
,同时有资源文件config.properties
2
3 那么,应该有如下代码:
4 ReflectTest. class .getResourceAsStream( " config.properties " );
5
6 第二:在ReflectTest.class目录的子目录下,例如:com.ljq.test下有类ReflectTest. class ,同时在com.ljq.test.resource目录下有资源文件config.properties
7
8 那么,应该有如下代码:
9 ReflectTest. class .getResourceAsStream( " resource/config.properties " );
10
11 第三:不在ReflectTest.class目录下,也不在子目录下,例如:com.ljq.test下有类ReflectTest. class ,同时在com.ljq.resource目录下有资源文件config.properties
12
13 那么,应该有如下代码:
14 ReflectTest. class .getResourceAsStream( " /com/ljq/resource/config.properties " );
15
16 总结一下,可能只是两种写法
17
18 第一:前面有 “ / ” ,“ / ”代表了工程的根目录,例如工程名叫做test,“ / ”代表了test
19 ReflectTest. class .getResourceAsStream( " /com/ljq/resource/config.properties " );
20
21 第二:前面没有 “ / ” ,代表当前类的目录
22 ReflectTest. class .getResourceAsStream( " config.properties " );
23 ReflectTest. class .getResourceAsStream( " resource/config.properties " );
24
25 最后,总结
26 getResourceAsStream读取的文件路径只局限在工程的源文件夹中,包括在工程src根目录下,以及类包里面任何位置,但是如果配置文件路径是在除了源文件夹之外的其他文件夹中时,该方法是用不了的。
2
3 那么,应该有如下代码:
4 ReflectTest. class .getResourceAsStream( " config.properties " );
5
6 第二:在ReflectTest.class目录的子目录下,例如:com.ljq.test下有类ReflectTest. class ,同时在com.ljq.test.resource目录下有资源文件config.properties
7
8 那么,应该有如下代码:
9 ReflectTest. class .getResourceAsStream( " resource/config.properties " );
10
11 第三:不在ReflectTest.class目录下,也不在子目录下,例如:com.ljq.test下有类ReflectTest. class ,同时在com.ljq.resource目录下有资源文件config.properties
12
13 那么,应该有如下代码:
14 ReflectTest. class .getResourceAsStream( " /com/ljq/resource/config.properties " );
15
16 总结一下,可能只是两种写法
17
18 第一:前面有 “ / ” ,“ / ”代表了工程的根目录,例如工程名叫做test,“ / ”代表了test
19 ReflectTest. class .getResourceAsStream( " /com/ljq/resource/config.properties " );
20
21 第二:前面没有 “ / ” ,代表当前类的目录
22 ReflectTest. class .getResourceAsStream( " config.properties " );
23 ReflectTest. class .getResourceAsStream( " resource/config.properties " );
24
25 最后,总结
26 getResourceAsStream读取的文件路径只局限在工程的源文件夹中,包括在工程src根目录下,以及类包里面任何位置,但是如果配置文件路径是在除了源文件夹之外的其他文件夹中时,该方法是用不了的。