zoukankan      html  css  js  c++  java
  • ClassLoader类加载解惑

    1、通过类加载器获取路径:

               String path = Thread.currentThread().getContextClassLoader().getResource(".").getPath();
               System.out.println(path);
         
               String string = Sample1.class.getClassLoader().getResource(".").getPath();
               System.out.println(string);
         
               String string2 = Sample1.class.getResource(".").getPath();
               System.out.println(string2);

    测试结果:

        /D:/workspaces/workspace7/demo1/target/classes/
        /D:/workspaces/workspace7/demo1/target/classes/
        /D:/workspaces/workspace7/demo1/target/classes/com/alibaba/

    说明:

    Classloader读取文件(即方式1和方法2)都是从classpath开始查找文件; 方式3从当前类所在的目录下开始查找文件
    不同的工程中,实验如下:

        public class Sample2 {
            public static void main(String[] args) {
                Sample1 sample1 = new Sample1();
                sample1.print();
            }
        }

    执行结果:

        /D:/workspaces/workspace7/demo2/target/classes/
        /D:/workspaces/workspace7/demo2/target/classes/
        /D:/workspaces/workspace7/demo1/target/classes/com/alibaba/

    说明:Classloader获取的内容始终从调用方出发,即当前调用的加载器; 而一般类的资源获取是从类自身的位置触发


    当获取当前类路径下的文件使用:
    InputStream f=TestDemo.class.getResourceAsStream("book.xml");//book.xml与TestDemo.class同意路径下
    而加载classpath下的文件book.xml使用以下方式
    InputStream f=TestDemo.class.getClassLoader().getResourceAsStream("book.xml");//book.xml与TestDemo.class同意路径下

    注意:通过以下获取资源获取的都是相对路径下文件
    InputStream in = new FileInputStream("abc.properties"); // 相对路径,项目下的路径 与ClassLoader加载有什么区别吗
    OutputStream out = new FileOutputStream("abc.properties");

    通过加载器进行加载类路径创建对象
            String loaderClassName="com.mysoft.test.classloader.ClassLoaderTest";
            Class<?> loaderClass = null;
            loaderClass = ClassLoaderTest.class.getClassLoader().loadClass(loaderClassName);
            ClassLoaderTest s=(ClassLoaderTest)loaderClass.newInstance();
            System.out.println(s.getName());
            
            Class<?> loaderClass2 = null;
            ClassLoader cl=Thread.currentThread().getContextClassLoader();//获取当前线程的加载器,安全起见采用该方式
            loaderClass2=cl.loadClass(loaderClassName);
            ClassLoaderTest s2=(ClassLoaderTest)loaderClass2.newInstance();
            System.out.println(s2.getName());

  • 相关阅读:
    【RL-TCPnet网络教程】第3章 初学RL-TCPnet的准备工作及其快速上手
    【二代示波器教程】第15章 FreeRTOS操作系统版本二代示波器实现
    【RL-TCPnet网络教程】第2章 嵌入式网络协议栈基础知识
    【二代示波器教程】第14章 uCOS-III操作系统版本二代示波器实现
    【RL-TCPnet网络教程】第1章 当前主流的小型嵌入式网络协议栈
    徐州网络赛H-Ryuji doesn't want to study【线段树】
    徐州网络赛F-Feature Trace【暴力】
    徐州网络赛C-Cacti Lottery【DFS】
    南京网络赛I-Skr【回文树模板】
    AC自动机
  • 原文地址:https://www.cnblogs.com/atwanli/p/6074824.html
Copyright © 2011-2022 走看看