呵呵,楼主总结的不错。你上面总结的一些在张老师的视频中讲到过的,其原理都是用类加载器去加载指定资源文件,返回一个关联该文件的读取流对象。至于写法的话,应该就这么多了,因为用类加载器去加载首先会返回这个类加载器加载指定类文件下面的那个类文件路径,然后再跟你要加载的文件(该文件在当前目录下或当前目录的子目录中)拼接起来就成了一个完整的资源文件路径了,由于你的文件相对于类文件目录会有一些不同,因此会有多种写法。
这是我在这一节中的注释,请多指教。
public class ClassLoaderTest {
public static void main(String[] args) throws Exception {
/*
* MyClassLoader是一个自定义类加载器,覆盖了findClass方法,会走父类中定义好的流程,指定加载itcastlib目录下的类,当调用loadClass方法后,
* 会先到父类下去查找指定的类文件(这可能是由于继承的关系,子类构造函数中都含有父类super引用,子类创建对象会先执行super(),),没找到后
* 调用findClass方法,由于自定义类加载器覆盖了findClass方法,因此会调用子类中的findClass方法,而子类中的findClass方法中在通过defineClass把指定的类文件
* 转成字节码文件对象。
*/
Class clazz = new MyClassLoader("itcastlib").loadClass("cn.itcast.calssLoader.ClassLoaderAttachment");
Date d1 = (Date)clazz.newInstance();//通过自定义类加载器加载后的字节码文件创建对象实例
System.out.println(d1);
}
}
|