087.JAVA反射机制_通过反射加载资源文件


博主的 Github 地址


1. 通过反射加载资源文件

  • 加载 properties 资源文件, 只能使用 Properties 类的 load() 方法.

1.1. 方式 1: 用绝对路径的方式加载(写死的一个文件路径)

  • 该方式一般来说不使用, 因为路径写死了, 不利于项目适配.
    且交出项目时给的是项目的 bin 文件夹, 文件夹之外的内容是不会提供的.

  • 操作如下:

    public void load1() throws Exception{
    //创建一个资源对象
    Properties p = new Properties();
    
    //创建一个输入流对象用以获取文件, 注意使用绝对路径
    InputStream in = new FileInputSteam("D:/file/db.properties");
    
    //从输入流中读取属性列表, 读取后数据都存储在Properties对象中
    p.load(in);
    }

1.2. 方式 2: 用相对路径的方式加载(相对 classpath 的根路径)

  • 通过在项目中建立 resource 文件夹, 则可以把资源文件自动存在字节码文件输出目录当中.
  • 字节码文件输出目录的根路径称为 classpath, 而 ClassLoader 对象就默认
    classpath 路径开始寻找文件, 注意这个根目录就是 bin 文件夹.
1.2.1. ClassLoader 类
  • 可以通过一个 ClassLoader 对象来获取这个 classpath 路径.

  • java.lang.ClassLoader 类对象是类加载器, 是负责加载类的对象.
    类中存在 getResourceAsStream(String name) 方法,
    可以返回读取指定资源的输入流, 因此可以用来加载资源文件.

1.2.2. 获取 ClassLoader 类对象的方式
  • 方式 1:
    Class 类中存在 getClassLoader() 方法, 可以返回指定类的类加载器.
    调用实例:

    ClassLoader cl = TargetClass.class.getClassLoader();  
  • 方式 2:
    在线程类中也存在 getContextClassLoader() 可以获取目标线程的类加载器.
    可以通过线程类的静态方法获取当前的线程, 然后通过当前线程获取类加载器.

    ClassLoader cl = Thread.currentThread().getContextClassLoader();
1.2.3. ClassLoader 对象获取资源文件实例
  • 一般来说方式 2 是最实用的获取 ClassLoader 对象方式.

    public void load2()) throws Exception{
    //创建一个资源对象
    Properties p = new Properties();
    
    //获取ClassLoader对象
    ClassLoader cl = Thread.currentThread().getContextClassLoader();
    
    //创建一个输入流对象用以获取ClassLoader返回的文件输入流对象, 只要给定文件名即可
    InputStream in = cl.getResourceAsStream("db.properties");
    
    //从输入流中读取属性列表, 读取后数据都存储在Properties对象中
    p.load(in);
    }

1.3. 方式 3: 使用相对路径(相对于当前加载资源文件的字节码路径)

  • Class 类中也存在着 getResourceAsStream(String name) 方法,
    也可以用来查找具有给定名称的资源, 返回这个资源的输入流.

  • 但实际上这个方法和 ClassLoader 中的方法默认的寻找路径是不一样的.

    • ClassLoader 是从 bin 文件夹这个根目录直接开始找.
      因此资源文件直接存放在 bin 文件夹中即可.

    • Class 的这是从字节码文件所在的包文件夹去寻找.
      而这里的资源文件则需要存放在字节码文件所在的包当中才行.

  • 该方法的操作应用和 ClassLoader 中的是一样的, 只是文件存放位置不一样.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值