黑马程序员技术交流社区

标题: 关于类加载器 [打印本页]

作者: 何竹冬    时间: 2013-1-6 14:23
标题: 关于类加载器
本帖最后由 何竹冬 于 2013-1-6 17:17 编辑

张孝祥老师在讲反射的时候说到可以用一个类的加载器调用getResourceAsStream方法获取到加载这个类的目录下指定的文件,也就是classpath下指定的文件,
有点不明白,这个类不是在某个包里吗,路径应该是classpath下的某个包啊?

作者: 徐帅    时间: 2013-1-6 14:39
本帖最后由 徐帅 于 2013-1-6 14:41 编辑

    在源目录(.java文件所在目录)下存放自己的资源,eclipse会自动把 .java文件编译成class文件,并存放到classpath下,
而将非.java文件原封不动的按目录结构移动到classpath下。所以我们可以使用类加载器来加载资源文件,但是这种方式是只读的。
所以我们若是想对文件进行写入,应该使用IO流来读取
    这里所有的相对都是相对于.java文件的所在目录,也是就说在使用相对路径时,开始的路径都是此路径,我这里的相对路径是cn.java.test
下面列举3种使用类加载器加载的方法:

1、当资源在相对路径cn.java.test下(注意cn前面没有’/’):
ClassName.class.getClassLoader().getResourceAsStream(“cn/java/test/config.properties”);

2、比较简便的方式:
ClassName.class. getResourceAsStream(“config.properties”);

3、绝对方式(相对于第2种方式,较复杂):
ClassName.class.getResourceAsStream(“/cn/java/test/config.properties”)

作者: 何竹冬    时间: 2013-1-6 15:11
徐帅 发表于 2013-1-6 14:39
在源目录(.java文件所在目录)下存放自己的资源,eclipse会自动把 .java文件编译成class文件,并存放 ...

你好
class文件不是在classpath下的某个包里吗
作者: 舒远    时间: 2013-1-6 16:09
使用类加载器加载资源文件:

现有类目录结构如下:工程根路径/bin/com/test/reflect/ReflectTest.java

资源文件路径:工程根路径/bin/com/test/reflect/config.properties

则在ReflectTest.java中调用资源文件有如下几种写法

1.  InputStream ips = new FileInputStream("bin/com/test/reflect/config.properties");//使用IO的绝对路径形式。

2.  InputStream ips =ReflectTest.class.getResourceAsStream("config.properties");//class直接找资源的方法,当前路径为ReflectTest.java类文件所在路径。

3.  InputStream ips =ReflectTest.class.getClassLoader().getResourceAsStream("com/test/reflect/config.properties");//使用类加载器找到classpath路径的方法。推荐并常用的方法。

4.     InputStream ips = ReflectTest.class.getResourceAsStream("/com/test/reflect/config.properties");//此方法为相对于根路径的全路径写法。

作者: 徐帅    时间: 2013-1-6 17:10
何竹冬 发表于 2013-1-6 15:11
你好
class文件不是在classpath下的某个包里吗


在加载文件的时候,虚拟机会自动到classpath下去找.class文件,所以我们不需要指定classpath,平时我们在运行某个程序时,
其实就是运行的其.class的字节码文件,所以每次都要将源文件编译成字节码文件,虚拟机只认得字节码文件,所以我们不需
要指定,虚拟机会自己去找。希望对你有帮助。
作者: 何竹冬    时间: 2013-1-6 17:17
多谢大家




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2