zoukankan      html  css  js  c++  java
  • 框架的概念及用反射技术开发框架的原理<br/>getResourceAsStream用法详解

    反射的作用—>实现框架的功能

    框架-用户类-工具类:框架与工具类有区别,工具类被用户的类调用,而框架则是调用用户提供的类。

    框架要解决的核心问题:框架如何调用未知的类:通过反射来实现

    综合案例: 使用配置文件读取调用类的名字

    工程目录

     

    ReflectTest测试类

    1 package com.ljq.test;
    2
    3 import java.io.FileInputStream;
    4 import java.io.InputStream;
    5 import java.util.Collection;
    6 import java.util.Properties;
    7
    8  /**
    9 * 使用配置文件读取调用者的类
    10 *
    11 * @author jiqinlin
    12 *
    13 */
    14  public class ReflectTest {
    15 public static void main(String[] args) throws Exception{
    16 //使用绝对路径,否则无法读取config.properties
    17 //InputStream inStream=new FileInputStream("F:\\android\\test\\src\\com\\ljq\\test\\resource\\config.properties");
    18
    19 //ReflectTest.class.getClassLoader().getResourceAsStream(String path): 默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。
    20 //InputStream inStream = ReflectTest.class.getClassLoader().getResourceAsStream("com/ljq/test/resource/config.properties");
    21
    22 // ReflectTest.class.getResourceAsStream(String path): path不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。
    23 //其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。
    24 //InputStream inStream = ReflectTest.class.getResourceAsStream("/com/ljq/test/resource/config.properties");
    25
    26 //config.properties配置文件所在目录是ReflectTest类所在子目录,才可以;否则报空指针异常
    27   InputStream inStream = ReflectTest.class.getResourceAsStream("resource/config.properties");
    28
    29 Properties props=new Properties();
    30 props.load(inStream);
    31 inStream.close();
    32
    33 String className=props.getProperty("className");
    34 Collection collection=(Collection)Class.forName(className).newInstance();
    35 collection.add("123");
    36 System.out.println("size="+collection.size()); //size=1
    37   }
    38 }

    config.properties配置文件

    className=java.util.HashSet

    getResourceAsStream用法大致有以下几种:

    1 第一:要加载的文件和.class文件在同一目录下,例如:com.ljq.test目录下有类ReflectTest.class,同时有资源文件config.properties
    2
    3 那么,应该有如下代码:
    4 ReflectTest.class.getResourceAsStream("config.properties");
    5
    6 第二:在ReflectTest.class目录的子目录下,例如:com.ljq.test下有类ReflectTest.class,同时在com.ljq.test.resource目录下有资源文件config.properties
    7
    8 那么,应该有如下代码:
    9 ReflectTest.class.getResourceAsStream("resource/config.properties");
    10
    11 第三:不在ReflectTest.class目录下,也不在子目录下,例如:com.ljq.test下有类ReflectTest.class ,同时在com.ljq.resource目录下有资源文件config.properties
    12
    13 那么,应该有如下代码:
    14 ReflectTest.class.getResourceAsStream("/com/ljq/resource/config.properties");
    15
    16 总结一下,可能只是两种写法
    17
    18 第一:前面有 “/” ,“/”代表了工程的根目录,例如工程名叫做test,“/”代表了test
    19 ReflectTest.class.getResourceAsStream("/com/ljq/resource/config.properties");
    20
    21 第二:前面没有 “/” ,代表当前类的目录
    22 ReflectTest.class.getResourceAsStream("config.properties");
    23 ReflectTest.class.getResourceAsStream("resource/config.properties");
    24
    25 最后,总结
    26 getResourceAsStream读取的文件路径只局限在工程的源文件夹中,包括在工程src根目录下,以及类包里面任何位置,但是如果配置文件路径是在除了源文件夹之外的其他文件夹中时,该方法是用不了的。
  • 相关阅读:
    Benelux Algorithm Programming Contest 2016 Preliminary K. Translators’ Dinner(思路)
    Benelux Algorithm Programming Contest 2016 Preliminary Target Practice
    Benelux Algorithm Programming Contest 2016 Preliminary I. Rock Band
    Benelux Algorithm Programming Contest 2016 Preliminary A. Block Game
    ICPC Northeastern European Regional Contest 2019 Apprentice Learning Trajectory
    ICPC Northeastern European Regional Contest 2019 Key Storage
    2018 ACM ICPC Asia Regional
    2018 ACM ICPC Asia Regional
    Mybatis入库出现异常后,如何捕捉异常
    优雅停止 SpringBoot 服务,拒绝 kill -9 暴力停止
  • 原文地址:https://www.cnblogs.com/linjiqin/p/1954647.html
Copyright © 2011-2022 走看看