java 根据类名示例化类_如何使用示例从Java中的类路径加载资源
java 根据类名示例化类
Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容。 Java提供了API来将这些资源读取为InputStream或URL。 假设您在项目的config文件夹中有一个属性文件 ,并且想要加载该属性文件,该怎么做? 同样,您的项目的icons目录中有Web应用程序的图标和缩略图,如何加载它们? 答案是通过使用java.lang.Class'getResource()和getResourceAsStream()方法。 这些方法接受资源的路径为String并分别返回URL和InputStream。 您可以通过调用getClass()方法或使用类literal获取类的引用。 如果有一个对象,则可以调用getClass(),因为它是一个非静态方法,另一方面,如果没有任何对象,则可以简单地将.class与任何类的名称一起使用,例如Sample.class将为您提供java.lang.Class的参考。 JDK 1.1提供了这些方法,您甚至可以在有权访问核心Java库的任何地方使用它们。 如果要创建J2ME游戏或应用程序,则可以使用这些方法为游戏加载图标和图块,并为应用程序加载所有其他资源。
在内部,此方法将资源的加载请求委托给其类加载器。 如果对由BootStrap ClassLoader加载的对象调用getResourceAsStream()方法,则它将把它委托给ClassLoader.getSystemResourceAsStream(java.lang.String)方法。 我们将资源路径传递给此方法,但是用于搜索与给定类关联的资源的规则由该类的定义类加载器实现。 由于您可以将绝对路径和相对路径都传递给Class.getResourceAsStream(),但是ClassLoader.getResourceAsStream()采用绝对路径,因此这就是使用以下算法从给定资源名称构造绝对资源名称的原因:
如果名称以“ /”('\ u002f')开头,则资源的绝对名称是名称中“ /”之后的部分。 否则,绝对名称的格式如下:
modified_package_name / name,其中modified_package_name是此对象的软件包名称,用“ /”代替“。”。 ('\ u002e')。
这意味着,如果app.properties存储在com.abc.config包中而不是当前类的包中,则传递给该方法的资源名称应类似于/com/abc/config/app.properties。
如果您通过使用快捷键Ctrl + T并键入java.lang.Class来查看Eclipse IDE中java.lang.Class的代码,则可以看到此方法的工作方式:
public InputStream getResourceAsStream(String name) {name = resolveName(name);ClassLoader cl = getClassLoader0();if (cl==null) {// A system class.return ClassLoader.getSystemResourceAsStream(name);}return cl.getResourceAsStream(name);
}
该算法是通过resolveName()方法实现的,如下所示:
/*** Add a package name prefix if the name is not absolute Remove leading "/"* if name is absolute*/private String resolveName(String name) {if (name == null) {return name;}if (!name.startsWith("/")) {Class c = this;while (c.isArray()) {c = c.getComponentType();}String baseName = c.getName();int index = baseName.lastIndexOf('.');if (index != -1) {name = baseName.substring(0, index).replace('.', '/')+"/"+name;}} else {name = name.substring(1);}return name;}
使用getResourceAsStream()方法加载资源时出现的主要问题是NullPointerException ,因为此方法如果找不到资源,则返回null。 在下面的示例中,我们有一个Eclipse项目,并且我在config目录中创建了一个名为app.properties的属性文件。 现在要加载该文件,我只需要传递“ app.properties”,如果传递诸如“ config / app.properties”或“ /config/app.properties”之类的信息,getResourceAsStream()将返回null,随后代码将抛出NullPointerException如下所示:
Exception in thread "main" java.lang.NullPointerExceptionat java.util.Properties$LineReader.readLine(Unknown Source)at java.util.Properties.load0(Unknown Source)at java.util.Properties.load(Unknown Source)at Test.main(Test.java:29)
为了避免此错误,您必须在使用getResourceAsStream()之前检查其输出,由于这种方法,防御性编程就在那里。
这是我们完整的Java程序,可以从Java的classpath加载图像,资源,文本文件或二进制文件,资源可以是任何东西,重要的是必须可访问。
package test;import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;/*** Java Program to demonstrate how to load resources e.g. properties file from* classpath. There are two ways to load resources in Java, one by using* getResourceAsStream() and getResource() method from java.lang.Class. Main* difference between these two methods are that one returns an InputStream* while other returns a URL object.** @author Javin Paul*/
public class ResourceLoader{public static void main(String args[]) {// loading resource using getResource() methodInputStream in = Test.class.getResourceAsStream("app.properties");Properties config = new Properties();try {config.load(in);System.out.println(config.getProperty("name"));System.out.println(config.getProperty("version"));} catch (IOException e1) {e1.printStackTrace();}// loading resource using getResourceAsStream() methodURL resourceURL = Test.class.getResource("app.properties");Properties appConfig = new Properties();try {appConfig.load(resourceURL.openStream());System.out.println(appConfig.getProperty("name"));System.out.println(appConfig.getProperty("version"));} catch (IOException e) {e.printStackTrace();}}}Output:
SampleApp
1.0.0
SampleApp
1.0.0
如果仔细观察,您会发现我们同时使用了getResource()和getResourceAsStream()方法从Java中的类路径加载资源,在这种情况下只是属性文件。 第一个示例看上去比第二个示例更加简洁,因为我们不需要打开显式流,getResourceAsStream()方法将返回一个InputStream ,可以在任何地方使用它。 这就是如何从Java中的类路径加载资源的全部内容。
翻译自: https://www.javacodegeeks.com/2014/08/how-to-load-resources-from-classpath-in-java-with-example.html
java 根据类名示例化类
java 根据类名示例化类_如何使用示例从Java中的类路径加载资源相关推荐
- 如何使用示例从Java中的类路径加载资源
Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容. Java提供了API来将这些资源读取为InputStream或URL. 假设 ...
- ue4 通过指定路径加载资源_求助!加载pak资源到内存后,如何引用资源显示出来到地图中?...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 如题!已经pak资源包已经加载在内存中了,但是不知道如何把pak的uasset引用出现在地图当中?请各位大佬帮助提示下,非常感谢! 代码: for (in ...
- 【Android 插件化】Hook 插件化框架 ( 从源码角度分析加载资源流程 | Hook 点选择 | 资源冲突解决方案 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- JAVA:错误: 编码GBK的不可映射字符;错误: 找不到或无法加载主类;
目录 一.编码GBK的不可映射字符: 1.现象 2.解决方法 ANSI:ANSI是什么编码? - malecrab - 博客园 (cnblogs.com) 二.找不到或无法加载主类 一.编码GBK的不 ...
- 【Java 虚拟机原理】Java 类中的类加载初始化细节 ( 只使用类中的常量时加载类不会执行到 ‘初始化‘ 阶段 )
文章目录 一.类加载初始化时机 二.常量加载示例 三.数组加载示例 一.类加载初始化时机 类加载时机 : Java 程序执行时 , 并不是一开始将所有的字节码文件都加载到内存中 , 而是用到时才进行加 ...
- java中成员变量的加载时机_工作奇谈——JAVA高级特性之反射
一.从问题入手 最近又要面试新人,所以翻了翻以前的代码,突然发现了一个有意思的问题. 问:如下一个Student类,请实例Student并对其成员变量赋值. public class Student ...
- android verticalviewpager 下拉刷新 上拉加载_设计规范 | 详解组件控件结构体系:加载类...
设计师在进行APP设计时,往往会更加专注于界面的布局.界面和界面之间怎么跳转.操作反馈,却往往忽略掉一个比较重要的环节,就是APP数据加载中的设计.那么我们怎么处理好界面交互中的加载设计,保证体验无缝 ...
- 一文了解 Java 中 so 文件的加载原理
前言 无论是 Android 开发者还是 Java 工程师应该都有使用过 JNI 开发,但对于 JVM 如何加载 so.Android 系统如何加载 so,可能鲜有时间了解. 本文通过代码.流程解释, ...
- python 按需加载_基于python的opcode优化和模块按需加载机制研究(学习与个人思路)(原创)...
基于python的opcode优化和模块按需加载机制研究(学习与思考) 姓名:XXX 学校信息:XXX 主用编程语言:python3.5 文档转换为PDF有些图片无法完全显示,请移步我的博客查看 完成 ...
最新文章
- 基于Jquery插件Uploadify实现实时显示进度条上传图片
- 某程序员吐槽:媳妇要给孩子报少儿编程班,将来继续做程序员!以后要看到穿着纸尿裤的P7!...
- 计算类class的sizeof大小
- python中的reduce、lambda函数
- Sun JDK: Hashmap.get非法使用的挂起分析
- 内推|底层翻身的机会来了,快来看一看!
- pythontcp文件传输_python socket实现文件传输(防粘包)
- 项目管理过程组和知识领域 简介重点记忆
- (计算机组成原理)第二章数据的表示和运算-第二节8:数据的存储和排列
- 共享单车数据集_共享单车项目数据可视化展示
- 【Elasticsearch】Nori:官方的韩语分析插件Elasticsearch
- hdoj_1421搬寝室
- Atitit web 3.0(web技术)展望与实现 和语义网络 目录 1. 为了说明Web 3.0,我们需要回顾Web历史上的重要浪潮。	2 1.1. 2.Web 2.0:任何人可以参与。Web
- 制作粉色少女系列 生日快乐祝福网页(HTML+CSS+JS)
- 世界主要的11种气候类型特点及分布
- python一只青蛙一次可以_Python算法题(一)——青蛙跳台阶
- fanuc机器人空间信号解析
- 联通的G网和C网分别是什么意思?
- echarts-wordcloud 热词云使用
- CF869 E. The Untended Antiquity
热门文章
- ssl提高组国庆模拟赛【2018.10.5】
- Hadoop2.6.0的Intellij Idea 插件
- DI 之Spring更多DI的知识
- mysql查询优化explain命令详解
- 分享18道Java基础面试笔试题
- Java 内存泄露总结
- js的三元表达式用来替换表格中的颜色
- 【spring boot】启动类启动 错误: 找不到或无法加载主类 com.codingapi.tm.TxManagerApplication 的解决方案
- 服务器io修改,更改 Linux I/O 调度器来改善服务器性能
- java中configmanager_Spring4新的javaConfig注解