`
donghp1979
  • 浏览: 9304 次
  • 性别: Icon_minigender_1
  • 来自: 兰州
最近访客 更多访客>>
社区版块
存档分类
最新评论

你知道你的类是从哪个文件中装载的吗?

阅读更多

由于项目用到的Jar包或者Classpath内容较多,经常出现同时装载两份Class的情况,今天恰好在浏览时看到如下代码:

public class Whoami {

 /**
  * @param args
  * @throws Exception
  */
 public static void main(String[] args) throws Exception {
  // TODO Auto-generated method stub
  which(Whoami.class);
 }

 public static void which(Class aClass) throws Exception {
  System.out.println(aClass.getProtectionDomain().getCodeSource().getLocation());
 }

}

输出如下:

file:/D:/Applications/Workspaces/JBossTools/registration/build/classes/

检查你用的类到底是从哪个Jar包或者目录下装载的,这样以后类似问题也多了一个诊断的手段!哈哈哈

如果你怀疑你用的类的版本,那么请用这个方法吧!

参考文章:

http://www.0xcafefeed.com/2008/05/where-was-this-class-loaded-from/

 

 

 

评论
4 楼 SysTem128 2009-01-11  
this.getClass().getResource(".");
// 或
this.getClass().getResource("/");


以上代码返回的结果有可能为
classes/
classes/package/Class.class
如果在Web容器下有可能返回 /usr/local/tomcat/bin   /usr/local/resin/bin (实际程序部署位置可能是 /webroot/app/),更有甚者会返回  / 或 c:/ (glassfish里好像)。

有时候,尤其是在部署Web应用且不能拿到ServletContext的时候。需要有其它方式获取WEB-INF文件夹的位置。

我们期望的是一种统一的结果 比如 getResource(".")即返回当前class文件路径,getResource("/")即返回 classes/ 路径。可惜在实践过程中并非如此,虽然有比较权宜的解决方式了(判断半天看看有没有classes/出现在路径里),但还是希望有人能提出更为灵巧的解决方法。
3 楼 donghp1979 2009-01-11  
在使用OSGi时估计会遇到无法确定加载哪个包的类的情况的,这是后打印一下也有好处。
2 楼 javatracker 2009-01-11  
要想能清楚类加载的是哪个包中的类要弄清楚两个方面:
1、类加载器的原理;
2、容器或框架的加载机制;
一般业务代码都是AppClassLoader或其子类加载的,如果同一个类两次加载的加载器在同一个分支通路上,那么就只有最上面加载的那个类,不存在加载两个类的情况。如果处于不同的分支,不同的加载器就得到不同的两个类
1 楼 unsid 2009-01-10  
我遇到这样的问题了,感觉同样是classpathload的两个同名同目录类,那个jar包牌在操作系统文件列表的前面,先装载哪个类

相关推荐

    11.如何在列表框中自动装载磁盘文件列表?(Visual C++编程 源代码)

    11.如何在列表框中自动装载磁盘文件列表?(Visual C++编程 源代码)11.如何在列表框中自动装载磁盘文件列表?(Visual C++编程 源代码)11.如何在列表框中自动装载磁盘文件列表?(Visual C++编程 源代码)11.如何...

    Java类文件动态装载

    在Java编程语言中,类文件的动态装载是一个关键特性,它允许程序在运行时加载未知或需要在后期确定的类。这种灵活性对于实现插件系统、动态代理、反射和其他高级功能至关重要。本篇文章将深入探讨Java类文件的动态...

    jvm类装载器原理

    在这个方法中,我们需要执行一系列操作,例如检查类是否已加载,是否是系统类,从特定位置加载类,定义类,解析类等。 特别地,JVM有一个内置的根装载器(bootstrap ClassLoader),它加载的是Java核心库中的类,被...

    11.如何在列表框中自动装载磁盘文件列表?.

    在编程领域,尤其是在开发用户界面(UI)时,经常需要将磁盘上的文件或目录列表显示在列表框(ListBox)中。...通过掌握这些基础,你可以轻松地在自己的应用中实现这个功能,为用户提供更加直观的文件浏览体验。

    Java深度历险(2)--深入类装载器

    3. **隔离性**:不同的类装载器可以加载相同的类文件,但是这些类在JVM中被认为是不同的类。这种隔离性对于实现多租户环境特别有用,因为它允许不同的用户或应用程序拥有独立的类空间。 #### 类装载器的工作原理 ...

    Java虚拟机类装载.doc

    Java虚拟机(JVM)的类装载是指将包含在类文件中的字节码装载到JVM中,并使其成为JVM的一部分的过程。Java虚拟机的类动态装载技术能够在运行时刻动态地加载或者替换系统的某些功能模块,而不影响系统其他功能模块的...

    FAT文件系统与文件装载

    在操作系统中,文件装载(file loading)是指将程序从磁盘加载到内存中以便执行的过程。在FAT文件系统下,这个过程涉及以下步骤: 1. **定位文件**:操作系统首先根据文件路径找到对应的文件目录项,获取文件的首簇...

    从dll中动态装载

    在"从dll中动态装载类的源程序"中,可能包含了创建和管理DLL资源的示例代码。通常,这样的代码会包括以下步骤: 1. 加载DLL:使用LoadLibrary函数。 2. 获取函数指针:使用GetProcAddress函数。 3. 调用DLL中的函数...

    Java虚拟机类装载的原理及实现

    - **尝试从类装载器的存储区获取所请求的类**:从缓存中查找已装载的类。 - **在虚拟机中定义所请求的类**:如果没有找到,使用`defineClass()`方法创建`Class`对象。 - **解析所请求的类**:将符号引用转换为直接...

    利用类装载器动态加载类并启动类

    ### 利用类装载器动态加载类并启动类 #### 概述 本文将详细介绍如何通过自定义类装载器来动态加载并启动类的过程,同时介绍一个简单的位移加密算法和非运算加密算法,以及如何使用这些算法进行文件的加密与解密。此...

    Java虚拟机类装载:原理、实现与应用

    本文主要探讨了类装载的原理、实现方式及其在实际应用中的作用。 首先,类装载的过程分为三个主要阶段:装载、链接和初始化。装载阶段涉及寻找并导入类或接口的二进制数据,通常由类装载器(ClassLoader)执行。...

    Java虚拟机类装载机制

    Java虚拟机类装载机制是Java运行环境中的核心组成部分,它负责将类的字节码从磁盘、网络等不同来源加载到JVM中,并进行一系列处理以使类能够被正确地使用。类装载机制的目的是为了实现代码的动态加载和运行时的灵活...

    Java的类装载器和命名空间

    类装载器负责将类文件加载到Java虚拟机(JVM)中,而命名空间则帮助组织和管理这些类,避免命名冲突。 1. **类装载器(ClassLoader)** 类装载器是Java动态性的一个关键组件,它们根据类的全限定名(包括包名和...

    exe文件装载过程

    【exe文件装载过程】 在Windows操作系统中,当用户运行一个.exe可执行文件时,系统会进行一系列复杂的步骤来装载和执行程序。以下是exe文件装载过程的详细解释: 1. **程序段前缀PSP(Program Segment Prefix)** ...

    Linux文件系统装载探究.pdf

    【Linux 文件系统装载探究】 Linux 文件系统在信息化建设中扮演着至关重要的角色,因为它负责管理和存储数据。Linux 系统采用“一切皆是文件”的哲学,这意味着不仅仅是普通的文本文件,就连目录、字符设备、块设备...

    程序员的自我修养—链接、装载与库.pdf

    装载(Loading)是指将可执行文件加载到内存中的过程。在这个过程中,操作系统将可执行文件加载到内存中,并将其映射到虚拟地址空间中。 装载有两种方式:静态装载和动态装载。静态装载是指在编译时将可执行文件...

    单片机文件分散装载技术

    分散装载技术主要应用于基于ARM架构的单片机系统中,通过定义一个特殊的散布局文件(.scf文件),来指定程序不同部分的加载位置。 #### 二、散布局文件(scatter file)的作用与格式 **作用:** 散布局文件是用来...

Global site tag (gtag.js) - Google Analytics