java 获取类加载器_java-如何从类加载器获取类路径?

更新:我下面的原始答案很不充分,因为我花了三年的时间开发FastClasspathScanner,并提交了大量关于某些类路径环境无法使用该库的错误报告。 FastClasspathScanner现在可以处理许多复杂的类路径规范机制。 在一般情况下(即使扫描它),即使只是找到类路径也可能会变得异常复杂,因为有很多方法可以将jar和目录添加到类路径。

一方面,我在下面提供的代码只能处理URLClassLoader,并且许多主要的运行时环境和容器都没有对此进行扩展,它们从头实现了自己的类加载器。 但是,在Java 9+的情况下,它变得比这复杂得多,因为即使传统的类路径仍然存在,未来的一切都将朝着使用模块路径而非类路径发展。 模块具有URL,但它们是"jrt:/" URL,而不是"file:/" URL,并且模块URL实际上不包括文件路径,仅包含模块名称-因此,您甚至不能在磁盘上找到该模块。 您唯一的选择是使用(高度封装的)模块系统来处理模块。 我在这里写了有关如何扫描模块路径的文章。

FastClasspathScanner处理许多复杂的类路径规范机制,因此您无需重新发明轮子。 您可以从FastClasspathScanner中获取类路径条目的列表-这将为您省去尝试与在野外发现的所有各种类路径规范机制一起使用的麻烦。 (如果最后一个链接断开,我们深表歉意– FCS的API和文档将很快更改。)

--

[旧答案-已过时:]

其他答案在大多数情况下都是正确的,但比某些情况下要复杂得多。 Maven,Tomcat和JUnit具有自己的类路径支持,并且不使用系统类路径。

到目前为止,这是我设法提供的最完整的系统(此代码来自我的Fast Classpath Scanner项目):

/** The unique elements of the classpath, as an ordered list. */

private final ArrayList classpathElements = new ArrayList<>();

/** The unique elements of the classpath, as a set. */

private final HashSet classpathElementsSet = new HashSet<>();

/** Clear the classpath. */

private void clearClasspath() {

classpathElements.clear();

classpathElementsSet.clear();

}

/** Add a classpath element. */

private void addClasspathElement(String pathElement) {

if (classpathElementsSet.add(pathElement)) {

final File file = new File(pathElement);

if (file.exists()) {

classpathElements.add(file);

}

}

}

/** Parse the system classpath. */

private void parseSystemClasspath() {

// Look for all unique classloaders.

// Keep them in an order that (hopefully) reflects the order in which class resolution occurs.

ArrayList classLoaders = new ArrayList<>();

HashSet classLoadersSet = new HashSet<>();

classLoadersSet.add(ClassLoader.getSystemClassLoader());

classLoaders.add(ClassLoader.getSystemClassLoader());

if (classLoadersSet.add(Thread.currentThread().getContextClassLoader())) {

classLoaders.add(Thread.currentThread().getContextClassLoader());

}

// Dirty method for looking for any other classloaders on the call stack

try {

// Generate stacktrace

throw new Exception();

} catch (Exception e) {

StackTraceElement[] stacktrace = e.getStackTrace();

for (StackTraceElement elt : stacktrace) {

try {

ClassLoader cl = Class.forName(elt.getClassName()).getClassLoader();

if (classLoadersSet.add(cl)) {

classLoaders.add(cl);

}

} catch (ClassNotFoundException e1) {

}

}

}

// Get file paths for URLs of each classloader.

clearClasspath();

for (ClassLoader cl : classLoaders) {

if (cl != null) {

for (URL url : ((URLClassLoader) cl).getURLs()) {

if ("file".equals(url.getProtocol())) {

addClasspathElement(url.getFile());

}

}

}

}

}

/** Override the system classpath with a custom classpath to search. */

public FastClasspathScanner overrideClasspath(String classpath) {

clearClasspath();

for (String pathElement : classpath.split(File.pathSeparator)) {

addClasspathElement(pathElement);

}

return this;

}

/**

* Get a list of unique elements on the classpath (directories and files) as File objects, preserving order.

* Classpath elements that do not exist are not included in the list.

*/

public ArrayList getUniqueClasspathElements() {

return classpathElements;

}

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

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

相关文章

JIRA-6.3.6安装与破解

首先下载JIRA-6.3.6的安装包&#xff1a; wget http://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-6.3.6.tar.gz 在这里笔者新建JIRA用户来专门运行JIRA useradd jira passwd jira 把包解压到jira的宿主目录(/home/jira)下&#xff1a; tar -zxvf atla…

网店健康成长之路

对网店管理新规&#xff0c;前天中国社科院信息化研究中心举办中国网络零售产业环境学术研讨会&#xff0c;各界专家共同建议&#xff1a;国家尽快出台“电子商务促进法”&#xff0c;以规范各地政府、不同部门的监管行为。何时管&#xff1a;监管时机未到“网络零售产业规模占…

[development][profile][dpdk] KK程序性能调优

KK程序&#xff1a; 1. 两个线程&#xff0c;第一个从DPDK收包&#xff0c;通过一个ring数据传递给第二个线程。第二个线程将数据写入共享内存。 2. 第二个内存在发现共享内存已满时&#xff0c;会直接丢弃数据。 3. 线程二有个选项debug&#xff0c;用于每一次ring_dequeue之后…

求二进制数中1的个数

要求&#xff1a;对于一个字节&#xff08;8bit&#xff09;的变量&#xff0c;求其二进制表示中“1”的个数&#xff0c;要求算法的执行效率尽可能地高。 大多数的读者都会有这样的反应&#xff1a;这个题目也太简单了吧&#xff0c;解法似乎也相当地单一&#xff0c;不会有太…

CentOS安装glibc-2.14

到http://ftp.gnu.org/gnu/glibc/下载glibc-2.14.tar.xz tar glibc-2.14.tar.gz cd glibc-2.14 mkdir build cd build ../configure --prefix/usr/local/glibc-2.14 make -j4 su xxxx make install 看看现在libc.so.6在哪个位置&#xff0c;然后修改软链接 ln -s /usr/local/gl…

cesium米转换经纬度_cesium 常见坐标系及坐标转换(工具篇)

/** Description: 坐标转换工具&#xff0c;下面的坐标转换默认都是基于WGS84 椭球体*/class Degrees {constructor(longitude, latitude, height 0) {this.longitude longitude;this.latitude latitude;this.height height;}}Cesium.Degrees Degrees;//不建议这样直接修改…

sql 2005 try catch

--删除卡的记录 delete from ObjTransportCard where CardIdCardId --删除交易的记录 delete from ObjTransaction where CardIdCardId 在Sql 2000中,为了成功执行这个存储过程,我需要在每一条语句后面去判断ERROR,如果有错,则执行回滚.上例只是我举的一个简单的例子,如果在一个…

selenium拖动元素java_【自动化测试】Java+Selenium操作页面元素(合集)

本文基于Java语言&#xff0c;依托于Eclipse工具&#xff0c;使用Selenium框架&#xff0c;主要介绍在Selenium中&#xff0c;如何操作Web页面中的各种元素。Eclipse 搭建1.1、Eclipse 配置1.2、引入依赖包修改pom.xml文件在dependencys节点下&#xff0c;添加如下内容&#xf…

面试题 锁消除是什么

锁消除是在编译器级别的事情。 在即时编译器时&#xff0c;如果发现不可能被共享的对象&#xff0c;则可以消除这些对象的锁操作。 也许你会觉得奇怪&#xff0c;既然有些对象不可能被多线程访问&#xff0c;那为什么要加锁呢&#xff1f;写代码时直接不加锁不就好了。 但是…

通过日志恢复SQL Server的历史数据

园子里前段时间发过一篇通过日志恢复MSSQL数据例子 &#xff0c;我总结一下 通过日志还原&#xff0c;最重要的是&#xff1a; 1.必须有一个完整的备份&#xff0c;且这个备份必须是在修改、删除数据之前做的。 2.在更新、删除数据之后&#xff0c;做日志备份&#xff0c;该log…

JavaScript面向对象编程指南(五) 原型

第5章 原型 5.1 原型属性 function f(a,b){return a*b;};// length 属性f.length; //2// constructor 构造属性f.constructor; // function Function() { [native code] }// prototype 属性 初始值是空对象typeof f.prototype; //"object" 5.1.1 利用原型添加方法和…

java communal_平台用英语怎么说

平台通常指高于附近区域的平面;楼房的阳台。也指指计算机硬件或软件的操作环境。而在网络上所说的平台一般是指网站。那么你知道平台用英语怎么说吗?下面来学习一下吧。平台英语说法1&#xff1a;platform平台英语说法2&#xff1a;terrace平台英语说法3&#xff1a;flat roof…

面试题-- 什么是偏向锁

所谓的偏向&#xff0c;就是偏心&#xff0c;即锁会偏向于当前已经占有锁的线程 。 大部分情况是没有竞争的&#xff08;某个同步块大多数情况都不会出现多线程同时竞争锁&#xff09;&#xff0c;所以可以通过偏向来提高性能。即在无竞争时&#xff0c;之前获得锁的线程再次获…

Ping, IPConfig, Format, Netstat, etc. Not Recognized as Commands

Can you use them when you point directly to them..> C:\Windows\System32\ping.exe 127.0.0.1? If so, you probably have a messed up PATH variable.> echo %PATH%Should have "C:\Windows\System32" in it, does it? 以上为google的结果&#xff0c;我…

Collections.min()和Collections.max()的使用

取集合中的最小值 Collections.min(); 取集合中的最大值 Collections.max(); public class TestCollectionMinMax {public static void main(String[] args) {List<Integer> list new ArrayList<>();list.add(3);list.add(7);list.add(9);list.add(1);list.add(…

java date 过时_过时date.toLocaleString()的解决方法

过时date.toLocaleString()的解决方法 Java代码 收藏代码 System.out.println(new java.util.Date()); 输出&#xff1a;Thu Jan 27 14:43:28 CST 2011 Java代码 收藏代码 System.out.println(new java.util.Date().toLocaleString()); 输出&#xff1a;2011-1-27 14:45:…

linux下查看隐藏的文件

在linux下以点开头命名的文件在系统中视为隐藏文件&#xff0c;例如 “.123 ”。用ls、ls -l或者ll是无法查看的。那么如何才能查看linux系统下的隐藏文件呢&#xff1f;下面介绍一下简单的查看方式。1、#在命令行下使用ls -a2、#在XWindow的KDE桌面中在"查看(View)"…

python学习之路(九)

这一节主要讲的是装饰器。装饰器是一个非常好用的&#xff0c;用于装饰已有函数的函数功能。 其优点是不用修改调用方式&#xff0c;还不用修改源代码。 他的思想是&#xff1a;函数既变量&#xff1b;高阶函数&#xff1b;嵌套函数。 现在来尝试写装饰器 有两个函数 各自实现自…