-
java类装载机制 问题5
ClassName(自己写的一个类).class.getClassLoader()与Object.class.getClassLoader()好象是不同的,他们有什么区别?2008年6月25日 14:53
4个答案 按时间排序 按投票排序
-
采纳的答案
又详细查了一下资料:
启动类装载器(Bootstrap Loader:C编写的),标准扩展类装载器(Extended Loader:java编写的),类路径装载器(AppClassLoader:java编写的)
由于启动类装载器(Bootstrap Loader)是用C编写的所以调用它的时候会返回null
测试代码:Object o=new Object(); Class c=o.getClass(); ClassLoader loader=c.getClassLoader(); System.out.println(loader);
输出为null
新建一个类Test,测试它的加载器。Test o=new Test(); Class c=o.getClass(); ClassLoader loader=c.getClassLoader(); System.out.println(loader);
输出为sun.misc.Launcher$AppClassLoader@19821f
结果与我预想的一样,那么如何验证我之前的言论呢,即引用而MyClass.class的加载器调用的是类路径装载器,当MyClass.class请求加载的时候,JVM会看启动类装载器,标准扩展类装载器这两个加载器有没有加载这个类,如果加载了那么就放弃当前的这个类加载器,由于之前没有使用启动类装载器,标准扩展类装载器加载这个类,所有JVM还会用类路径装载器加载
我们做个实验,建一个类Test.javapublic class Test { /** * @param args */ public static void main(String[] args) { /*Coffee coffee=new Coffee(); coffee.prepareRecipe();*/ Test o=new Test(); Class c=o.getClass(); ClassLoader loader=c.getClassLoader(); System.out.println(loader); } }
编译之后copy到Java_home 的classes目录下,如果没有就建一个,之后把编译好的Test.class放到这个目录里。之后在cmd控制台java的bin目录下运行java -cp ./classes Test
看看结果,在我的机器上是null,之后在放到c盘根目录运行,发现是sun.misc.Launcher$AppClassLoader@18d107f
这就说明如果所加载的类在java的根目录下的某个目录运行,它调用的classLoader就是
BootstrapLoader 而其他目录就是类路径加载器了,而如果你想知道在哪个目录下会调用BootstrapLoader的话
用这句就可以看到System.out.println(System.getProperty("sun.boot.class.path"));
当然用BootstrapLoader性能要好一点,毕竟是C写的呀2008年6月25日 20:51
-
classloader(类加载器)分为4中:
启动类装载器,标准扩展类装载器,类路径装载器和网络类装载器
这4中加载的优先级从高到底。
其中long包中的类被启动类装载器加载,而MyClass.class的加载器调用的是类路径装载器,当MyClass.class请求加载的时候,JVM会看启动类装载器,标准扩展类装载器这两个加载器有没有加载这个类,如果加载了那么就放弃当前的这个类加载器,由于之前没有使用启动类装载器,标准扩展类装载器加载这个类,所有JVM还会用类路径装载器加载,这时MyClass.class.getClassLoader()得到的就是类路径装载器,而Object使用的是启动类装载器,所以就是不同的。2008年6月25日 18:28
-
class.getClassLoader() returns which ClassLoader Object load it.
YourClass 可能是被什么 JarClassLoader啦加载的(纯属猜测), Object 可能是jdk较底层的什么ClassLoader加载的,某些时候可以自定义ClassLoader的,那么用YourClassLoader load 的SomeClass,所对应的 SomeClass.class.getClassLoader() 就是你YourClassLoader。
我一般都用 Thread.currentThread().getContextClassLoader() 来加载ClassPath Resource,一直没有深究,没啥问题,用SomeClass.class.getClassLoader() 加载往往找不到,也没管它。2008年6月25日 15:10
相关推荐
Java虚拟机类装载机制是Java运行环境中的核心组成部分,它负责将类的字节码从磁盘、网络等不同来源加载到JVM中,并进行一系列处理以使类能够被...同时,理解类装载机制也有助于解决运行时类冲突、类加载异常等问题。
了解并熟练掌握Java虚拟机的类装载机制对于优化程序性能、设计健壮的系统架构以及解决复杂问题具有重要意义。通过深入学习和实践,开发者可以更好地利用Java平台的优势,实现高效、安全的应用程序。
Java虚拟机类装载机制是Java运行环境的核心技术之一,它允许程序在运行时动态加载和使用类,极大地增强了软件的灵活性和可扩展性。本文主要探讨了类装载的原理、实现方式及其在实际应用中的作用。 首先,类装载的...
### Java虚拟机类装载的原理及实现 #### 引言 Java虚拟机(JVM)作为执行Java程序的核心,承担着解释执行字节码的...通过深入了解类装载的过程和机制,开发者可以更好地利用这一特性来优化和增强Java应用程序的功能。
Java类装载器机制是Java语言灵活性的关键组成部分,尤其在J2EE应用服务器中扮演着重要角色。理解这一机制有助于开发者更好地部署和管理应用程序,解决可能出现的部署问题。 Java类装载器是Java虚拟机(JVM)的一...
Java虚拟机类装载 Java虚拟机(JVM)的类装载是指将包含在类文件中的字节码装载到JVM中...了解了JVM中的类装载机制和ClassLoader的工作原理,可以更好地理解Java虚拟机的工作机制,并更好地使用Java语言开发应用程序。
Java 类装载过程是Java虚拟机(JVM)运行的核心机制之一,主要涉及到类从加载到初始化的完整生命周期。这一过程确保了程序的正确运行,并在安全性方面起到关键作用。以下是详细的解释: 1)装载(Loading): 在这...
"Java卡的可信代码装载机制设计" 本文将详细介绍Java卡的可信代码装载机制设计,以满足可信计算平台(TCP)需求。该设计基于Java卡技术,采用代码签名技术作为主要手段,以卡内的安全域(Security Domain)作为各个...
Java虚拟机(JVM)的类装载机制是Java运行时环境的核心组成部分,它负责将类文件中的字节码加载到JVM中,使类成为JVM的一部分。类装载过程不仅涉及基本的类查找和导入,还包含了链接、验证、准备、解析和初始化等多...
本篇文章将深入探讨Java类文件的动态装载机制,并结合源码分析其工作原理。 Java类的装载过程主要由类加载器(ClassLoader)来完成,这是一个关键组件,它负责查找、加载和初始化类。Java类加载器分为系统类加载器...
类加载器是 Java 语言的一个创新,也是 ...不过如果遇到了需要与类加载器进行交互的情况,而对类加载器的机制又不是很了解的话,就很容易花大量的时间去调试 ClassNotFoundException和 NoClassDefFoundError等异常。
Java 类的动态装载机制是Java 虚拟机的一项核心技术,可以在运行时刻动态地加载或替换系统的 某些功能模块,而不影响系统其它功能模块的正常运行。介绍了Java 虚拟机中类的动态装载机制的原理、实现 及应用,分析了...
《JVM类装载器原理详解》 Java的JVM(Java Virtual Machine)类装载器是...总之,深入理解JVM的类装载器原理,不仅有助于我们更好地理解和调试Java程序,也有助于我们在实际开发中实现更加高效和灵活的类管理机制。
通过实践编写自己的类装载器,不仅可以加深对JVM内部工作原理的理解,还能锻炼对Java反射、字节码操作、类加载机制的掌握。这是一个提升Java技术水平的重要步骤,也是成为一名资深Java开发者必备的技能之一。
Java装载工具及方法是Java编程中的重要组成部分,它关乎到程序的运行时环境以及类的加载与执行。本文将深入探讨Java的装载工具——类加载器(ClassLoader)以及相关的加载方法,旨在为开发者提供详尽的指导。 首先...
2. **Java类加载机制**: Java的类加载机制是基于“类装载器”(ClassLoader)的。JVM使用类加载器将.class文件加载到内存中,转换为Class对象。默认有三个内置的类加载器:Bootstrap ClassLoader(引导类加载器)、...
此方法不仅加深了我们对于Java类装载机制的理解,同时也提供了一种实用的数据保护手段。 #### 位移加密算法 位移加密算法是一种简单但有效的加密方式,主要通过改变字节的二进制位位置来实现加密和解密功能。 ####...
Java 动态代理机制是Java语言提供的一种在运行时创建代理类和代理对象的机制,主要涉及`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。动态代理通常用于实现AOP(面向切面编程)、事件...