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_pa​​ckage_name / name,其中modified_pa​​ckage_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;}

从Java中的类路径加载资源
使用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 根据类名示例化类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340516.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java课程设计进程管理_Java课设总结(个人版)

使用物理引擎JBox2D完成游戏关卡的各个物理状态模拟根据物理引擎设计Bird,Pig,Brick等游戏中出现的可运动刚体类建立JBox2d的工具类以实现###本人对这次课设的看法与吐槽 1.课设内容的脑洞是我在看完17级学长的游戏课设之后想出的 当时还没学java网络编程的内容,误以…

二叉树层次遍历c语言_[LeetCode] 107. 二叉树的层次遍历 II

题目链接 : https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/题目描述:给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如: 给…

使用测微计收集应用程序指标

什么是千分尺? 千分尺是一个简单的外观,用于以供应商中立的方式收集Java应用程序中的指标。 您可以考虑使用SLF4J作为指标。 Micrometer内置了对许多不同指标后端的支持,包括Atlas,Datadog,Elastic,JMX等。…

只读副本和Spring Data第1部分:配置数据库

这是有关我们为利用只读副本来提高应用程序性能而寻求的一系列博客文章。 对于这个项目,我们的目标是建立我们的spring数据应用程序,并使用read仓库进行写操作,并基于read副本进行读操作。 为了模拟这种环境,我们将通过Docker使…

java结构体系_java io结构体系

Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点:1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系2. 原始处理器(适配器)与链接流处理器(装饰器)其结构图如下:Reader-Writer体系1. 基类…

javaserver_如何在JavaServer Pages中使用Salesforce REST API

javaserver摘要:本教程提供了一个JSP示例以及如何将其与Salesforce REST API集成。 我们将逐步完成创建外部客户端以使用Force.com (同时使用HTTP(S)和JSON)管理数据的分步过程。 在此示例中,我将Mac OS X…

jmeter线程数并发数区别_如何确定Kafka的分区数、key和consumer线程数、以及不消费问题解决...

在Kafak中国社区的qq群中,这个问题被提及的比例是相当高的,这也是Kafka用户最常碰到的问题之一。本文结合Kafka源码试图对该问题相关的因素进行探讨。希望对大家有所帮助。怎么确定分区数?“我应该选择几个分区?”——如果你在Kaf…

插入排序java_「Java」各类排序算法

排序大的分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。下面讲的排序都是属于内排序。内排序有可以分为以下几类:(1) 插入排…

华为光伏usb适配器_华为系列原装充电器拆解第三弹:比亚迪版华为10W充电器

在对华为18W充电器的比亚迪版和赛尔康版进行拆解之后,充电头网今天继续为大家带来华为10W充电器的比亚迪版和达宏版的拆解。这两种10W规格的华为充电器外观延续了华为原装充电器的风格,而且型号也是一样的。那么,我们先一起来看看比亚迪版华为…

JMetro版本11.5.10和8.5.10发布

在这里,我们再次使用JMetro的另一个版本。 此版本中的新增功能: 工具栏内控件的新样式 新的可编辑组合框样式 对其他样式的一些调整 一些修复 继续阅读以获取详细信息。 可编辑的ComboBox新样式 JMetro早期版本的可编辑ComboBox看起来非常糟糕&am…

1s后跳转 android_优雅保活方案,原来Android还可以这样保活

作者:NanBox保活现状我们知道,Android 系统会存在杀后台进程的情况,并且随着系统版本的更新,杀进程的力度还有越来越大的趋势。系统这种做法本身出发点是好的,因为可以节省内存,降低功耗,也避免…

wordpress致命错误怎么解决_pppoe错误是什么意思 pppoe错误怎么解决

最近有网友反应无线路由器上设置PPPoE拨号上网后,发现PPPoE连接不上,显示pppoe错误是什么意思呢?pppoe错误怎么解决呢?接下来详细为大家介绍:pppoe错误怎么解决无线路由器设置PPPoE拨号后,PPPoE拨号连接不上,不能够上…

java ssm 多租户_(十一)java B2B2C 源码 多级分销springmvc mybatis多租户电子商城系统- SSO单点登录之OAuth2.0登录流程(2)...

上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名密码实现OAuth2.0的登录认证):上面的图很清楚的描述了当前登录…

几何画板200个经典课件_项目制学科联动 | 金芬娥首席工作室:灵动“画板”,研修创新,协同进步...

西湖区成立115个“项目制首席教师工作室”,建立中小学、幼儿园学科联动机制,以专业发展为目标,以教育问题为导向,整合发挥学科教研员、学科带头人和名师工作室领衔人的智力资源,助推教师的专业成长及区域的学科建设。西…

通过这些简单的步骤从头开始学习Java

Java是用于软件开发的最流行的编程语言之一。 无论您的最终目标或技能水平如何,学习和掌握Java都将为您作为开发人员打开大门。 今天,我们将讨论一些原因,我们认为您应该开始学习Java,然后提供有关入门的深入路线图。 为什么要学…

vs 服务容器中已存在服务_敏捷基础设施和公共基础服务

敏捷基础设施和公共基础服务敏捷基础设施和公共基础服务是微服务架构的有力支撑;能够简化业务开发,提升架构能力的基线。Cloud Native的基石是微服务架构、敏捷基础设施和公共基础服务。敏捷基础设施 - 通过容器封装环境,开发人员可以直接将所…

使用php吧excel数据存到数据库,php如何存excel数据到数据库

一、使用PHPExcel Parser Pro软件,但是这个软件为收费软件;二、可将EXCEL表保存为CSV格式,然后通过phpmyadmin或者SQLyog导入,SQLyog导入的方法为:将EXCEL表另存为CSV形式;打开SQLyog,对要导入的…

sle linux lftp禁止匿名登陆_软件测试常用linux命令整理

作为一个名软件测试工程师,掌握Linux的基本操作是必须的。下面罗列下linux的常用命令,方便大家今后操作linux时查找,然后通过[帮助命令]进行具体的使用。1、帮助命令man -- man 命令 查看命令的使用帮助说明。2、显示目录和文件的命令ls --…

用php模拟斗地主发牌,php模拟实现斗地主发牌

本文实例为大家分享了php实现斗地主发牌的具体代码,供大家参考,具体内容如下闲来无聊,就写了这个方法,也算是熟悉下php的数组操作,还请各位大神多指教。$arr 数组,好像有点问题,应该 2>"…

如何在AWS EC2实例上部署Spring Boot应用程序

你好朋友, 在本教程中,我们将看到如何在AWS EC2实例上部署Spring Boot应用程序。 这是我们将要执行的步骤。 1.使用Spring Boot Initialiser创建一个Spring Boot项目。 2.创建一个休息端点,部署后我们可以访问 3.启动EC2实例 4.将我们的…