`
sibyl_pisces
  • 浏览: 146094 次
  • 性别: Icon_minigender_2
  • 来自: 青岛
社区版块
存档分类
最新评论

java项目路径与类装载

    博客分类:
  • Java
阅读更多

问题:

1,this.getClass().getResource("/").getPath()
2,this.getClass().getClassLoader().getResource("/").getPath()
请教这两个方法获得路径的玄机.............
谁能解释一下获得路径的原理
奇怪现象:
在某一个项目中(这个项目我不熟悉)我用1获得了路径,用2得到的是null这又是为什么呢
ps:用1得到的是<tomcat_home>/bin,用2得到null
正常现象:用一个我熟悉的web项目
用1得到<tomcat_home>/webapps/wfa/WEB-INF/classes/
用2也是得到<tomcat_home>/webapps/wfa/WEB-INF/classes/

代码是放在jsp页面中执行的,当然放在java类中一样......

 

回复:

 

getClass():取得当前对象所属的Class对象  
getClassLoader():取得该Class对象的类装载器
类装载器负责从Java字符文件将字符流读入内存,并构造Class类对象,在你说的问题哪里,通过它可以得到一个文件的输入流

 

装载类的过程非常简单:查找类所在位置,并将找到的Java类的字节码装入内存,生成对应的Class对象。

Java的类装载器专门用来实现这样的过 程,JVM并不止有一个类装载器,事实上,如果你愿意的话,你可以让JVM拥有无数个类装载器,当然这除了测试JVM外,我想不出还有其他的用途。

你应该 已经发现到了这样一个问题,类装载器自身也是一个类,它也需要被装载到内存中来,那么这些类装载器由谁来装载呢,总得有个根吧?没错,确实存在这样的根, 它就是神龙见首不见尾的Bootstrap ClassLoader. 为什么说它神龙见首不见尾呢,因为你根本无法在Java代码中抓住哪怕是它的一点点的尾巴,尽管你能时时刻刻体会到它的存在,因为java的运行环境所需要的所有类库,都由它来装载,而它本身是C++写的程序,可以独立运行,可以说是JVM的运行起点,伟大吧。

在Bootstrap完成它的任务后,会生成 一个AppClassLoader(实际上之前系统还会使用扩展类装载器ExtClassLoader,它用于装载Java运行环境扩展包中的类),这个 类装载器才是我们经常使用的,可以调用ClassLoader.getSystemClassLoader() 来获得,我们假定程序中没有使用类装载器相关操作设定或者自定义新的类装载器,那么我们编写的所有java类通通会由它来装载,值得尊敬吧。

AppClassLoader查找类的区域就是耳熟能详的Classpath,也是初学者必须跨过的门槛,有没有灵光一闪的感觉,我们按照它的类查找范围 给它取名为类路径类装载器。还是先前假定的情况,当Java中出现新的类,AppClassLoader首先在类传递给它的父类类装载器,也就是 Extion ClassLoader,询问它是否能够装载该类,如果能,那AppClassLoader就不干这活了,同样Extion ClassLoader在装载时,也会先问问它的父类装载器。我们可以看出类装载器实际上是一个树状的结构图,每个类装载器有自己的父亲,类装载器在装载 类时,总是先让自己的父类装载器装载(多么尊敬长辈),如果父类装载器无法装载该类时,自己就会动手装载,如果它也装载不了,那么对不起,它会大喊一 声:Exception,class not found。

有必要提一句,当由直接使用类路径装载器装载类失败抛出的是NoClassDefFoundException异常。如果使用自定义的类装载器loadClass方法或者ClassLoader的findSystemClass方法装载类,如果你不去刻意改变,那么抛出的是 ClassNotFoundException。

这里jdk告诉我们:如果一个类是通过bootstrap 载入的,那我们通过这个类去获得classloader的话,有些jdk的实现是会返回一个null的,比如说我用 new Object().getClass().getClassLoader()的话,会返回一个null,这样的话上面的代码就会出现 NullPointer异常.所以保险起见我们最好还是使用我们自己写的类来获取 classloader("this.getClass().getClassLoader()“),这样一来就不会有问题。

 

http://topic.csdn.net/u/20101012/12/a4da25e9-5160-47ce-8be9-159890043da7.html

分享到:
评论

相关推荐

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

    ### Java深度历险(2)--深入类装载器 #### 前言 在现代软件开发领域,特别是使用Java这样的高级...通过深入了解类装载器的工作原理和其实现方式,开发人员可以更好地利用Java的这一特性,为实际项目带来更大的价值。

    java源码包---java 源码 大量 实例

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    动态编译、加载java类

    2. **Java类加载机制**: Java的类加载机制是基于“类装载器”(ClassLoader)的。JVM使用类加载器将.class文件加载到内存中,转换为Class对象。默认有三个内置的类加载器:Bootstrap ClassLoader(引导类加载器)、...

    java 代理例子 -javaagent,premain方式实现

    在Spring Boot应用中,我们可能会创建一个`springboot-agent-test`项目,这个项目包含了一个实现了`javaagent`接口的类,例如`MyAgent`。在`MyAgent`类中,我们需要重写`premain`方法,并在其中进行我们的代理逻辑。...

    JAVA深度历险

    《JAVA深度历险》这本书是Java开发者进阶的宝贵资源,它深入探讨了Java语言的内部机制,特别是类装载器这一关键概念。类装载器在Java应用程序中扮演着至关重要的角色,它是Java虚拟机(JVM)的重要组成部分,负责...

    JAVA上百实例源码以及开源项目源代码

    [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,...

    java源码包3

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...

    java-error-in-idea64主要是javaJVM的dump导出学习使用

    - **持久代使用情况**:如果涉及持久代(PermGen或Metaspace),确保没有过多的类装载导致内存溢出。 - **垃圾收集行为**:分析GC日志,看是否存在垃圾回收效率低下的问题,例如Full GC过于频繁。 通过以上分析,你...

    java源码包2

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...

    Java Web之高级应用,以ppt的形式呈现

    这些主题包括了Tomcat类装载器的理解与配置、HTTPS协议的实施、自动登录和单点登录功能的添加、Web开发中的路径处理、以及字符编码问题的解决。 首先,Tomcat中的类装载器是Java Web应用的基础组件之一,它负责加载...

    基于Java开发的中国象棋单击游戏,包括打谱,装载棋谱,人机对战,可用于自主学习和毕设参考,.zip

    这可以通过设置Java项目构建路径和依赖管理(如Maven或Gradle)来实现。 总的来说,这个Java开发的中国象棋单机游戏项目涵盖了面向对象设计、文件I/O、数据结构、算法、用户界面设计等多个IT知识点。无论是对于初学...

    Java入门到精通-Java基础

    4. **安全性**:Java有内置的安全机制,如类装载器和访问控制,旨在保护系统免受恶意代码的侵害。 5. **健壮性**:Java强制类型检查和异常处理机制,提高了程序的稳定性和可靠性。 6. **多线程**:Java内置对多...

    java web高级开发

    类装载器在Java Web应用程序中起着至关重要的角色,它们负责加载和管理应用的类。例如,在`context.xml`中配置资源如邮件服务,通过`&lt;Resource&gt;`标签定义,然后在Java代码中(如`MailServlet.java`)使用JNDI查找...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,...

    java源码包4

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...

    30种java技术框架-方案架构图汇总.pdf

    2. **JVM架构**:Java虚拟机是Java程序运行的基础,它包括类装载器、运行数据区、执行引擎、本地方法接口和本地方法库。了解JVM内存模型(如堆、栈、方法区等)对于进行性能调优和避免内存泄漏至关重要。 3. **Java...

    java知识点(吐血推荐).doc

    Java虚拟机(JVM)是Java技术的核心组成部分,它的主要功能包括装载类、解释执行字节码文件、提供与硬件平台的交互以及垃圾回收。JVM使得Java代码能在任何支持JVM的平台上运行,实现了“一次编写,到处运行”的理念...

    Java Web之高级应用

    - 使用相对路径可能导致在不同部署环境下的路径问题,合理规划项目结构和使用服务器配置可以帮助解决这类问题。 5. **配置相同页眉和页脚的技巧**: - 可以通过模板引擎(如FreeMarker、Velocity)或者包含指令...

Global site tag (gtag.js) - Google Analytics