Java~文件路径、类加载过程、双亲委派机制

Java~文件路径、类加载过程、双亲委派机制,第1张

文章目录
        • 如何在类路径下获取文件的绝对路径
        • 以流的形式直接返回路径
        • 更直接:一步到位之资源绑定器的使用
        • 类加载机制
        • 双亲委派模型

如何在类路径下获取文件的绝对路径
public static void main(String[] args) throws Exception {
        //这种路径的缺点:移植性差,在IDEA中默认的当前路径是project的根
        //离开了IDEA,这个路径就无效
       // FileReader reader=new FileReader("src/main/resources/classinfo2.properties");



        //Thread.currentThread() 当前线程对象
        //getContextClassLoader() 线程对象的方法 可以获取到当前线程的类加载器对象
        //getResource() 类加载器的方法,当前线程的类加载器默认从类的根路径下加载资源
        String path=Thread.currentThread().getContextClassLoader().getResource("classinfo2.properties").getPath();

        //采用以上的代码就可以拿到文件的绝对路径
       // /C:/Users/apple/Desktop/bite-learning-2022-master/java100/untitled/target/classes/classinfo2.properties
        System.out.println(path);
    }
以流的形式直接返回路径
    public static void main(String[] args) throws Exception{

        //获取文件的绝对路径
        //方式一:拿到文件的绝对路径,然后自己创建一个文件流
        // String path=Thread.currentThread().getContextClassLoader().getResource("classinfo2.properties").getPath();
       // FileReader reader=new FileReader(path);
        //用绝对路径也有一个缺点:只能在Windows下运行,如果换到linux就运行不了
        
        //方式二:直接以流的形式返回
        InputStream reader=Thread.currentThread().getContextClassLoader().getResourceAsStream("classinfo2.properties");
        Properties pro=new Properties();
        pro.load(reader);
        reader.close();
        //通过key来获取value
        String className=pro.getProperty("className");
        System.out.println(className);
        
    }
更直接:一步到位之资源绑定器的使用

创建一个配置文件在IDEA的src/resources目录下
资源绑定器是用来获取配置文件、资源文件的,
不是用来获取.java文件的

  public static void main(String[] args) {
        //资源绑定器的使用
        //在java.util包下提供了资源绑定器,便于获取属性配置文件中的内容
        //使用一下这种方式的时候,属性配置文件xxx.properties必须放到类路径下.
        //只能绑定xxx.properties文件。并且这个文件必须在类路径下,文件扩展名也必须是properties
        //就是这个文件必须在src路径下(默认搜索路径是src),如果文件不是直接在src下,而是在其子目录中,则需要写出访问的相对路径 
         //指明是哪个文件时,不用加文件扩展名


        ResourceBundle bundle=ResourceBundle.getBundle("123");
        String s=bundle.getString("classMyName");
        System.out.println(s);
//        ResourceBundle bundle=ResourceBundle.getBundle("classinfo2");
//        String className=bundle.getString("className");
//        System.out.println(className);
    }
类加载机制
  • 什么是类加载器?
    专门负责加载类的命令/工具
    ClassLoader

  • JDK中有三个类加载器
    启动类加载器(父加载器)
    扩展类加载器(母加载器)
    应用类加载器

  • 假设有这样代码:
    String s=“abc”;
    代码开始执行前,会将所需要的类加载到JVM中,通过类加载器进行加载,先找到String.class字节码文件,找到就加载
    如何加载?
    先通过“启动类加载器”进行加载,启动类加载器专门加载rt.jar包下
    rt.jar包中都是JDK最核心的类库.
    (位置在jdk/jre/lib中)
    如果启动类加载器加载不到,会通过“扩展类加载器”进行加载
    扩展类加载器专门加载ext中的所有jar包
    (位置在JDK/jre/lib/ext)
    如果扩展类加载器也没有加载到,会通过“应用类加载器”进行加载
    应用类加载器专门加载classpath中的jar包
    (就是配置环境变量时用到的那个)

双亲委派模型

启动类加载器又被称为父加载器
扩展类加载器又被称为母加载器
这种加载机制又被称为“双亲委派模型”

  • 机制介绍
    为了保证类加载安全,才有了双亲委派机制.

  • 优先从父中加载,父无法加载到,再从扩展类加载器中加载,如果都加载不到,再考虑从应用类加载器中加载

这是一种安全机制,比如如果启动类中有String,而你自己写的应用类中也有一个String,如果不是按顺序加载,黑客如果在应用类中的String中植入了后门程序,那直接凉凉…

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/941930.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-17
下一篇 2022-05-17

发表评论

登录后才能评论

评论列表(0条)

保存