`

探究Java的.class文件和类加载器

 
阅读更多

        最近在拜读林昊先生写的《分布式Java应用基础与实践》,有一种相见恨晚的感觉。决定把自己看书的收获写出来。以前没有深度考虑.class文件里面到底是什么,今天我们就来一窥.class文件。

       首先写个超级简单的类:

public class User
{
	private int age;
}

 我将它保存之后放在E盘的根目录下。

         我们打开命令行:

1:编译之(加上-g是为了生成所有的调试信息,包括局部变量名及行号信息,在不加-g的情况下默认只生成行号信息):

 

 

 

 2:查看之:


 

      下来研究一下类加载器:

       首先通过一个例子看一下:

public class MyClass {
    public static void main(String args[]){
    	System.out.println(MyClass.class.getName());
    	System.out.println(MyClass.class.getClassLoader().toString());
    	System.out.println(MyClass.class.getClassLoader().getParent());
    	System.out.println(MyClass.class.getClassLoader().getParent().getParent());
    }
}  
//运行结果:
com.wjy.enumstudy.MyClass
sun.misc.Launcher$AppClassLoader@281d4b
sun.misc.Launcher$ExtClassLoader@19b5217
null

 

      我们发现最后一个输出为null,这并不代表没有这个类。而是因为这个类无法再代码中取到。这个类是有C++实现的,并非ClassLoader的子类。这个类的主要工作是加载rt.jar中的类库。

      AppClassLoader负责加载ClassPath中的jar包。

      ExtClassLoader负责加载扩展功能的jar包(jre/lib/ext中的类)。

      类加载器在加载类的时候会先让权给父加载器,只有父加载器无法加载时才会自己去加载。
      我们可以根据Class.getClassLoader方法是否为null判断这个类是不是引导类加载器加载的。

       也可以根据Class.getClassLoader方法查看当前类是哪个类加载器加载的。

关于这些类加载器的详细分析,待我后续再来。

  • 大小: 12.2 KB
  • 大小: 248.8 KB
分享到:
评论

相关推荐

    全面解析Java类加载器

    深入理解和探究Java类加载机制—-  1.java.lang.ClassLoader类介绍  java.lang.ClassLoader类的基本职责是根据一个指定的类的名称,找到或者生成其对应的字节代码,然后从这些字节代码中定义出一个Java 类,即 ...

    自己动手写Java虚拟机及class文件解析分析工具(java8运行)

    总的来说,《自己动手写Java虚拟机及class文件解析分析工具》提供了一套实用的学习资源,无论是对JVM原理的探究,还是对Java类文件格式的掌握,都能从中获益。通过阅读PDF文档和使用提供的工具,读者将能够深入到...

    java class翻译器 汉化版

    Java Class翻译器是一款专为Java开发者设计的工具,主要用于解析和理解Java的字节码(class文件)。在Java编程中,源代码会被编译成字节码,这些字节码是平台无关的,可以在任何支持Java的环境中运行。Class翻译器的...

    探究java的ClassLoader及类变量初始化顺序

    ClassLoader的层次结构通常包括Bootstrap ClassLoader(启动类加载器)、Extension ClassLoader(扩展类加载器)和AppClassLoader(应用程序类加载器)。Bootstrap ClassLoader负责加载JRE核心库,如rt.jar;...

    Java虚拟源代码.zip

    1. **类加载器**:在运行时,JVM通过类加载器将字节码文件(.class文件)加载到内存中。类加载器分为引导类加载器、扩展类加载器和应用程序类加载器,它们共同完成类的加载工作。 2. **字节码验证**:JVM在运行前会...

    winhex.zip

    通过WinHex,我们可以看到类结构、方法签名、常量池等信息,有助于理解JVM如何加载和执行字节码。 在提供的压缩文件中,我们注意到几个重要的组件: 1. `winhex-d.chm` 和 `winhex.chm`:这是WinHex的联机帮助文档...

    java深度历险

    Java中的类加载器分为引导类加载器、扩展类加载器和应用程序类加载器,以及用户自定义的类加载器。理解类加载的过程,包括双亲委托模型,对于理解和解决类加载问题至关重要。 “import”关键字在Java中用于导入其他...

    JVM原理.pdf

    类加载机制是Java语言中的一个核心概念,它负责将.class文件加载到内存中,创建对应的java.lang.Class对象。JVM将类加载过程分为加载、链接(验证、准备、解析)、初始化三个阶段。这个过程是动态的,它允许程序在...

    Inside the Java Virtual Machine(中文第2版).pdf

    通过阅读这本书,读者不仅可以深入理解JVM的工作原理,还可以学习如何编写类加载器,理解class文件、字节码以及它们在类加载时的转换和验证机制。这些内容对于想要编写高效、高性能Java程序的开发者来说具有极高的...

    6.1.1.JVM前奏篇笔记1

    在深入探讨JVM之前,我们先来了解一下Java的开发环境和源码到字节码的转换过程。Java是由Oracle公司提供的...通过学习这些知识,我们可以深入探究Java的内存管理、异常处理、多线程等高级主题,提升我们的编程技能。

    java-jdk源码学习

    - 学习JRE的类加载机制,了解双亲委派模型,有助于设计和实现自定义类加载器。 4. **集合框架** - 集合框架是Java库的核心部分,包括List、Set、Map等接口及其实现类。 - 源码分析可以理解它们的实现原理,如...

    java 反编译器

    需要注意的是,由于Java的编译器优化和类加载机制,反编译的代码可能与原始源代码有所不同,尤其是在方法内联、变量优化等情况下。此外,为了保护代码不被轻易反编译,开发者可能会使用混淆工具,如Proguard,来使反...

    luyten-0.4.4-Jad 非常好用的java反编译工具

    《深入理解Java反编译工具Luyten 0.4.4-Jad》 在Java开发领域,有时候我们需要查看或分析已编译的....通过熟练掌握Luyten的使用,我们可以在没有源代码的情况下,深入探究Java项目的内部机制,提升开发和调试的效率。

    java学习杂谈

    Java程序在运行时,如何定位并加载所需的类文件,是一个涉及类加载器(ClassLoader)的复杂过程。类加载器分为三个级别:Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader。它们各自负责不同...

    LuckyFrameClient.zip

    JVM在运行时会通过类加载器动态加载这些字节码,确保程序的执行。这个过程包括加载、验证、准备、解析和初始化五个阶段,确保了代码的安全性和高效运行。 2. **类结构与命名规则**:在"classes"目录下的类文件,...

    BicaVM JS版 for Java

    3. **类加载器**: 在JavaScript环境中加载和解析Java类文件。 4. **运行时环境**: 提供Java对象模型、内存管理和垃圾回收。 5. **异常处理**: 实现Java的异常处理机制,包括try-catch-finally结构。 6. **标准库**: ...

    Java JVM Instruction Set

    可以使用`javap`工具来反汇编已编译的Java类文件,查看字节码指令。例如,如果想要检查`X.class`文件中的字节码,可以使用命令: ```bash % javap -c X.class ``` ##### main()函数的局部变量部分 `main()`函数...

    openjdk-src.zip

    例如,`java.lang.SealedClass`和`java.lang.Permits`等,它们提供了关于类继承权限的元数据,并在编译器和运行时进行验证。 - **增强型switch表达式的实现**:这涉及到编译器和解释器的改变。在`...

    java从入门到精通视频笔记

    Java源代码以.java文件形式存在,经过编译成为.class字节码文件,然后由Java解释器加载到JVM中执行。 Java的基本数据类型包括整数类型(byte、short、int、long)、浮点类型(float、double)、布尔类型(boolean)...

    Java 实验内容

    3. **Java Application编写**:使用文本编辑器或IDE(如Eclipse、IntelliJ IDEA)编写程序,保存为.java文件。例如,`public class HelloWorld { public static void main(String[] args) { System.out.println(...

Global site tag (gtag.js) - Google Analytics