手动解析java字节码文件

深入理解class文件 1.class文件 1.1 class文件结构 1.2 class文件结构说明 class文件结构图中,u4、u2、u1表示该项占用子节数。比如常量池大小和接口数量各占两个子节,所以最多只能有65535个常量和最多能实现65535个接口。 ... 阅读详情

前言

我们平时编写的java源文件,也就是.java文件在经过编译过后会成为jvm能识别的.class文件,也就是编译成了字节码文件,jvm的执行引擎目前有两种执行的方式,字节码解释执行和模板解释执行,我们的通常的字节码文件要通过jvm(c++)解释成计算机能识别的硬编码,也就是汇编;而模板解释器是直接不通过C++代码进行解释执行,而是通过模板解释器直接解释成计算机能识别的硬编码,而这些被模板解释器解释成的硬编码也是热点代码,热点代码具有热点代码缓存区,这个也是jvm调优的一部分,但是jvm有默认的热点代码缓存大小,如果不是太懂最好不要调整这个值的大小;关于执行引擎的解释器后面的笔记再行记录,这篇笔记主要记录下我们通过手动的方式是如何解析字节码文件的,进而了解字节码文件是什么样的形式进行存储。

字节码文件原貌

字节码文件即.java文件通过javac命令生成的.class文件 我们在编译器比如Eclipse或者Idea中编写了java类,但是编译工具会自动给我们编译成.class文件,也就是字节码文件;
看看字节码文件的原貌
比如我这边有个java文件,如下:

public class ByteCode {


    private static int count = 1;

    public static void main(String[] args) {
        System.out.println(count);
    }
}

然后我们在windows下面通过javac或者开发工具给我们编译出来的字节码文件如下:

// class version 52.0 (52)
// access flags 0x21
public class com/bml/jvm/ByteCode {

  // compiled from: ByteCode.java

  // access flags 0xA
  private static I count

  // access flags 0x1
  public <init>()V
   L0
    LINENUMBER 3 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this Lcom/bml/jvm/ByteCode; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x9
  public static main([Ljava/lang/String;)V
   L0
    LINENUMBER 9 L0
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    GETSTATIC com/bml/jvm/ByteCode.count : I
    INVOKEVIRTUAL java/io/PrintStream.println (I)V
   L1
    LINENUMBER 10 L1
    RETURN
   L2
    LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
    MAXSTACK = 2
    MAXLOCALS = 1

  // access flags 0x8
  static <clinit>()V
   L0
    LINENUMBER 6 L0
    ICONST_1
    PUTSTATIC com/bml/jvm/ByteCode.count : I
    RETURN
    MAXSTACK = 1
    MAXLOCALS = 0
}

注意看上面的前两行字节码文件
// class version 52.0 (52)
// access flags 0x21

意思就是我们的编写的这个java类的版本号是52,52是jdk的那个版本呢? 我们来看一张图:
在这里插入图片描述

所以我们的class的大版本major是52,是jdk1.8的版本
然后access flags 0x21指的就是我们的class的访问权限,我们的class ByteCode肯定是public,因为java类文件已经在上面了,所以access_flags 0x21就是标示我们的ByteCode的访问权限时public,那么0x21是什么意思呢,我们再来看下面一张图:
在这里插入图片描述
所以0x21代表的就是0x0001?

看什么的private static int I,I是什么意思呢?I表示就是我们的int类型,具体看下图
在这里插入图片描述
byte ->B
char->C
double->D
…
在上面类似这种Ljava/lang.String就是代本的String类型的参数,如果是数组的就是[Ljava/lang/String;
比如我写一个方法的描述符:
([[Ljava/lang/String;, I, Ljava/bml/Test;)Ljava/lang/String;

String XXX(String[][] strArrs, int a, Test test)

我们再来看下字节码的16进制文件
在这里插入图片描述

手动解析字节码文件

我们先来看下字节码文件包含了那些部分在里面,我们如何解析:
在这里插入图片描述
看结构从上到下,左边的U2 U4代表就是本结构多少字节,我们都知道1字节代本2位;
所以字节码文件的前四个字节u4=cafebabe(小端模式),而计算机一般传输过程中会转出大端模式
如果是大端模式就是bebafdca

一般jvm在解析class字节码文件的时候,验证的时候就首先判断魔数是不是以cafebabe开头,如果不是就是一个非法的class文件

在上图中“!”表示不确定有,长度大小不确定,好比实现的接口数量,我们的类可能没有接口,如果解析出来没有那么这个域就不会存在
我们来解析一次:
魔数(u4):cafebabe
minor version(u2):0000(次版本号为0)
major version(主版本号u2):0034(十进制为52)
常量池大小(u2):0024(十进制36)
我们来看这个常量池大小,在idea中用jclasslib就可以看到
在这里插入图片描述

常量池解析

常量池列表:
在这里插入图片描述
是从01开始的到35,真实的常量池个数 = 字节码文件中的常量池个数 - 1
解析常量池就要借助一个表格来,常量池规则表:
在这里插入图片描述
我们这边解析几个常量池,36个太多了
规则:
1.看上表中每一项的tag都是u1,那么就代表着我们的后面的解析每次取1字节
2.取到1字节过后,看值是多少,然后找到所对应的常量
3.找到所对应的常量过后依次把常量池解析出来
从上表中的0024过后的第一字节是:0a
第一个常量:
tag(u1):0a(0a十进制是10,在常量池结构表中对应的是Constant_Methodref_info)
index(u2):0006(是一个索引,6代表指向的是第6个,一般在字节码中未#6)
name_and_type(u2):0017(十进制23,23代表指向的是第23个,一般在字节码中表示#23
我们来验证一下:
看下截图:
在这里插入图片描述
我们解析的时候可以根据idea生成的可视化和我们自己手动解析的对应起来就知道有没有解析对
在idea中如果我们点击#6或者#23会直接跳到对应的类型上去,#6 #23代表的就是引用。

第二个常量:
tag(u1):09(9代表的就是Constant_Fieldref_info)
class_info(u2):0018(十进制24,代表指向#24)
name_and_type_info(u2):0019(十进制25,代表指向#25)
我们再来验证一下:
在这里插入图片描述

完全正确,当然了,这边手动解析只是为了了解class的文件结构,真实的情况下都是写程序取解析的,比如字节码技术asm

access flag:0021(public,前面已经说过)如图:
在这里插入图片描述
this_class(u2):0005(十进制是5,也就是#5)看idea的截图如下:
在这里插入图片描述
super_class:(u2):0006(看上图一目了然)
interfacce_count(u2):0000(表示接口为0)
interfaces[]:因为interface_count为0,所以这个域就不会存在了
fields_count(u2):00 01(表示有一个字段属性)

解析字段属性

接下来是解析我们的具体字段属性,字段属性的解析规则如下:
在这里插入图片描述
fields_1(第一个属性):
在这里插入图片描述

access_flags(u2):00 0a(十进制为10,是private static)
看下图:
name_index(u2):00 07
descriptor_index(u2):00 08
attributes_count(u2):0000(代表属性个数ConstantValue为0)
attributes:如果属性的数量=0,这块区域在字节码文件中就不会出现。

方法解析

方法解析前先看我们的方法信息:
在这里插入图片描述
从上图中可以看出我们的类ByteCode中有三个方法,分别是、main、
init:字节码为我们的java类生成的构造方法
client:当我们的类中有静态属性或者静态代码块的时候会生成clinit方法
因为我们的ByteCode类中有静态属性存在,所以生成的方法有三个,默认构造方法、man方法和静态初始化方法
接下来是方法个数
methods_count(u2):00 03(代表我们有3个方法)
这里解析方法,我演示解析我们的方法
在这里插入图片描述
上图是方法解析的规则
第一个方法init
access_flags:00 01(public)
name_index:00 09(引用到常量池中第9个常量)
desc_index: 00 0A(引用到常量池中第10个常量)
attr_count: 00 01(有一个属性)
attrs(如果属性=0,字节码文件中就没有这个区域):
属性内容解析规则:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
attribute_name_index:00 0B(引用到常量池中第11个常量)
attribute_length: 00 00 00 2F(十进制47,表示长度为47)
max_stack:00 01
max_locals:00 01
code_length:00 00 05
codecode_length:2a b7 00 01 b1(根据长度取字节数)
exception_length:00 00 (无申明异常)
attribute_count:00 02(代表我们的方法有两个属性,也就是局部变量表和LineNumberTable)
attribute[attribute_count]:
Code属性的属性
在这里插入图片描述
attr_name_index: 00 0C(引用常量池12) LineNumberTable
att_length:00 00 00 06(长度为6)
line_number_length: 00 01(有一个LineNumber表)
[
start_pc:00 00
line_number: 00 03(具体的代码行数为3)
]
根据ByteCode的局部LineNumberTable在idea中所示:
在这里插入图片描述
LineNumberTable也就是jvm为什么会很准确定义到我们的代码错误行数等原理

          attr_name_index:00 0D(引用常量池13)LocalVariableTable 方法的局部变量表
          attr_len:00 00 00 0C(变量表长度为12)
          table_length:00 01(有一个局部变量表)
               [
                  start_pc: 00 00
                  length: 00 05(长度为5)
                  name_index: 00 0E(引用的是常量表的14)
                  des_index: 00  0F(引用的是常量表的15)
                  index: 00 00
               ]

根据ByteCode的局部变量表在idea中所示:
在这里插入图片描述
对应到上面的手动解析一目了然

还有最后一个属性的解析,非常简单,我这边就不解析,规则如下:
在这里插入图片描述
最后如果我们在电脑上如何查看自己的class的文件字节码,如果查看二进制的,直接用ue把class文件打开即可;
如果是为了查看字节码还可以在class的所在目录执行:
javap -verbose ByteCode.class

Last modified 2020-8-7; size 602 bytes
  MD5 checksum 367be1125b0a815faf617b48e78c0d20
  Compiled from "ByteCode.java"
public class com.bml.jvm.ByteCode
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #6.#23         // java/lang/Object."<init>":()V
   #2 = Fieldref           #24.#25        // java/lang/System.out:Ljava/io/PrintStream;
   #3 = Fieldref           #5.#26         // com/bml/jvm/ByteCode.count:I
   #4 = Methodref          #27.#28        // java/io/PrintStream.println:(I)V
   #5 = Class              #29            // com/bml/jvm/ByteCode
   #6 = Class              #30            // java/lang/Object
   #7 = Utf8               count
   #8 = Utf8               I
   #9 = Utf8               <init>
  #10 = Utf8               ()V
  #11 = Utf8               Code
  #12 = Utf8               LineNumberTable
  #13 = Utf8               LocalVariableTable
  #14 = Utf8               this
  #15 = Utf8               Lcom/bml/jvm/ByteCode;
  #16 = Utf8               main
  #17 = Utf8               ([Ljava/lang/String;)V
  #18 = Utf8               args
  #19 = Utf8               [Ljava/lang/String;
  #20 = Utf8               <clinit>
  #21 = Utf8               SourceFile
  #22 = Utf8               ByteCode.java
  #23 = NameAndType        #9:#10         // "<init>":()V
  #24 = Class              #31            // java/lang/System
  #25 = NameAndType        #32:#33        // out:Ljava/io/PrintStream;
  #26 = NameAndType        #7:#8          // count:I
  #27 = Class              #34            // java/io/PrintStream
  #28 = NameAndType        #35:#36        // println:(I)V
  #29 = Utf8               com/bml/jvm/ByteCode
  #30 = Utf8               java/lang/Object
  #31 = Utf8               java/lang/System
  #32 = Utf8               out
  #33 = Utf8               Ljava/io/PrintStream;
  #34 = Utf8               java/io/PrintStream
  #35 = Utf8               println
  #36 = Utf8               (I)V
{
  public com.bml.jvm.ByteCode();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lcom/bml/jvm/ByteCode;

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=1, args_size=1
         0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: getstatic     #3                  // Field count:I
         6: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
         9: return
      LineNumberTable:
        line 9: 0
        line 10: 9
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      10     0  args   [Ljava/lang/String;

  static {};
    descriptor: ()V
    flags: ACC_STATIC
    Code:
      stack=1, locals=0, args_size=0
         0: iconst_1
         1: putstatic     #3                  // Field count:I
         4: return
      LineNumberTable:
        line 6: 0
}


结束语

上面就是差不多一个类的手动解析的一个过程,当然了还有很多没有写上,比如有继承的该如何解析,接口的怎么解析,其实都是一样的道理,手动解析这个实在太麻烦,意在明白这个解析的过程
如果真的要解析class字节码文件,那么我们肯定根据规则去编写自己的应用程序取解析,去完成我们的需求,这边只是将字节码的结构和底层原理分析出来,根据这个思想和思路去解析我们的字节码文件;其实你不懂字节码文件也不影响你工作,不影响你写代码,但是知识的储备不就是为了丰富你的人生,精彩你的生活吗?不要永远守着那点知识“啃老”,要学习进步,不仅仅是为了能够生存,也为了能够让我们的人生更精彩。
其实了解我们的JVM对大家也是非常有用的,为什么呢?因为现在运行在jvm上的语言不仅仅是java了,很多语言都是自己实现了编译,让后在jvm上运行,所以jvm是相对永恒的,java可能是暂时的,所以我们了解下底层的一些知识点没有什么损失,也就浪费点业余时间而已。
java
groovy
kotlin
Scala的源文件 ,经过Scala的编译器,编译生成了.class文件
只要符合jvm规范的class文件都可以在jvm上运行,不仅仅是java
在这里插入图片描述
上图就是不同语言在jvm上运行,所以学好jvm真的很有必要

Java开发者必备:3种快速查看class文件JDK编译版本的方法(含Hex解析技巧) 本文为Java开发者详细介绍了三种快速查看class文件JDK编译版本的实用方法,包括使用IDE图形化工具、javap命令行工具以及深入字节码的十六进制解析技巧。重点解析了class文件头的‘CAFEBABE’魔数及版本号字节的含义,并提供了版本映射表和自动化脚本,帮助开发者高效排查环境兼容性问题,避免UnsupportedClassVersionError。 阅读详情

相关推荐

JVM探秘:深入理解类加载机制

在Java开发中,类加载是一个至关重要的概念。它负责将Java字节码转换为可执行代码,并将类加载到Java虚拟机(JVM)中。为了更好地理解类加载的内部工作原理,我们将手动编写一个简单的JVM,并深入研究其中的细节。我们将在JVM中手动执行类加载的过程。为了实现这一点,我们需要创建一个Java类加载器,它将负责加载类的字节码并创建相应的类对象。首先,让我们从一个简单的Java类开始,我们将使用这个类作为示例,并手动加载它。方法,这是自定义类加载器的核心方法。在这个方法中,我们读取类的字节码文件,并使用。

FvCode的博客 88

Java解析字节文件

Java操作字节

korn的博客 1645

Workbench下列车转向架随机振动疲劳分析

结果中添加功率谱响应工具(Response PSD Tool),可以查看几何体以及远程点上的功率谱密度,如下图11所示,这里查看几何体上某一硬点的加速度功率谱密度响应曲线,如下图12所示。结果中添加疲劳工具(Fatigue Tool),查看列车转向架的疲劳寿命情况,这里采用窄带的寿命假设理论,曝光时间为1s指明计算出的疲劳寿命的基本单位是秒,寿命结果如下图14所示,可以看到最大寿命为1e35s,最小寿命为2.3542e18s,注意单位制,可再次基础上将其转换为小时或天。频域上的统计计算,软件很快计算完成。

ansysxuexizhe的博客 2602

java中,输出时出现“[Ljava.lang.String@xxxxx”解读+解决

举例: 解读: [Ljava.lang.String;@4e25154f “[” 表示这是一维数组 "[["表示这是二维数组 "L"表示这是一个对象 "java.lang.String"表示该对象的类型 "@"后面的字符串表示该对象的HashCode 解决方案: 使用Arrays.toString(obj) ...

✈ 正在努力 の 寒江(StudiousTiger) ✌ 呐 ✈ 3万+

在 PyCharm 中使用 Copilot

此外,要在 PyCharm 中使用 GitHub Copilot,您必须有效订阅 Copilot。在 PyCharm 中安装 GitHub Copilot 后,您现在可以将其用作项目的扩展。此外,它很容易安装在不同的 IDE 平台上,您还可以为特定编程语言启用 GitHub 插件。此外,按照以下步骤,您可以轻松地在 PyCharm 中安装 GitHub Copilot。此外,在 IDE 上使用 GitHub Copilot 时,您可以使用一些快捷方式。

一览无遗 1万+

ROS2前置基础教程 | 使用CMakeLists.txt编译ROS2节点

答案是有的,那就是cmake工具。cmake通过调用CMakeLists.txt直接生成Makefile。 2.新建CMakeLists.txt 在新建,输入下面内容。 3.编译代码 我们一般会创建一个新的目录,运行cmake并进行编译,这样的好处是不会显得那么乱。 创建好文件夹,接着运行cmake指令,代表到上级目录找。 运行完cmake你应该可以在build目录下看到cmake自动生成的Makefile了,接着就可以运行make指令进行编译 运行完上面的指令,就可以在build目录下发现节点了。ROS2

生活不止眼前的苟且 1万+

JDK源码解析之 Java.lang.Double

Double类是原始类型double的包装类,它包含若干有效处理double值的方法,如将其转换为字符串表示形式,反之亦然。Double类的对象可以包含一个double值。 Double类包装原始类型的值 double中的对象。类型的对象 Double包含一个类型为的字段 double。 此外,这个类提供了转换的几种方法 double到String和 String一个double带有打交道时,以及其他常量和方法有用 double。 一、类定义 public final class Double exte.

栗筝i的博客 3579

关于Arduino中的常用函数

一、I/O函数 二、时间函数 三、数学函数 abs 返回其参数的无符号值 【abs(12)返回12,abs(-12)也返回12】 constrain 限制一个数字以阻止它超出范围。第一个参数是被限制的数字,第二个参数是范围区间的开始,第三个参数是允许的数字范围区间的结尾。 【constrain(8,1,10)返回8,constrain(11,1,10)返回10,constrain(0,1,10)返回1】 map 将一个范围内的数字映射到另一个范围。第一个参数是要映射到数字,第二个和第三个参数是from范围(

TREE的博客 7322

Java字节码解读

学习视频:《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!ore | 将栈顶 int 型数值存入指定本地变量 || 0x37 | lstore | 将栈顶 long 型数值存入指定本地变量 || 0x38 | fstore | 将栈顶 float 型数值存入指定本地变量 |自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

2401_84046545的博客 1198

AIGC实战:用ComfyUI和Lora微调打造专属原神角色(含完整工作流)

本文详细介绍了如何利用ComfyUI和Lora微调技术打造专属原神风格角色,涵盖从环境配置、数据集准备到工作流构建和Lora训练的全过程。通过模块化节点设计和高级控制技术,创作者可实现高度个性化的AIGC艺术创作,提升二次元角色生成的效率与质量。

weixin_29185199的博客 348

GD32主程序跑飞?可能是BOOT0引脚惹的祸(附J-LINK调试实录)

本文针对GD32微控制器程序下载后无法运行的典型问题,深入剖析了BOOT0引脚配置对启动模式的关键影响。通过结合J-LINK调试器与KEIL MDK环境,详细演示了如何从程序跑飞现象(如PC指向0x1FFF Fxxx)定位到硬件层面的BOOT0引脚与VDD短路故障,并提供了系统的硬件排查步骤与设计预防建议。

d6e7f8的博客 702

Java字节码文件结构剖析(一)

本文的 github 地址是

黄裳博客 838

Jvm之用java解析class文件

前言: 身为一个java程序员,怎么能不了解JVM呢,倘若想学习JVM,那就又必须要了解Class文件,Class之于虚拟机,就如鱼之于水,虚拟机因为Class而有了生命。《深入理解java虚拟机》中花了一整个章节来讲解Class文件,可是看完后,一直都还是迷迷糊糊,似懂非懂。正好前段时间看见一本书很不错:《自己动手写Java虚拟机》,作者利用go语言实现了一个简单的JVM,虽然没有完整实现JVM...

mhHao的博客 407

【数据集】全球湿度数据集总结

【数据集】全球湿度数据集总结

WW、forever的博客 1661

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

硬核手写字节码实现HelloWorld

这是一篇硬(闲的)核(蛋疼)的文章,我们来通过手写字节码的方式,来完成一个Helloworld。起因很简单,最近在看《深入理解JVM字节码》,尝试了解读class文件,但是总觉得不过瘾,...

麒思妙想 635

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JVM1:从一个class文件深入理解Java字节码结构

前言 我们都知道,Java程序最终是转换成class文件执行在虚拟机上的,那么class文件是个怎样的结构,虚拟机又是如何处理去执行class文件里面的内容呢,这篇文章带你深入理解Java字节码中的结构。 1.Demo源码 首先,编写一个简单的Java源码: package com.april.test; public class Demo { private int num = 1; public int add() { num = num + 2;

zhaofuqiangmycomm的博客 355

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

java 查看字节码指令,读取Java字节码指令:数字是什么意思?

I was reading java bytecode and saw this:getfield #5 (Field java.lang.String name)What does #5 mean?And how can I write a program in bytecode?解决方案Java class files and bytecodeJava class files (bytecod...

weixin_29982199的博客 131

java文件编译为class文件需要键入什么命令_没了 IDE,你的 Java 项目还能跑起来吗?...

计算机只能识别机器码0101...编程语言->能执行的机器码 需要经过 预处理->编译->汇编->链接->机器码过程。一个语言处理系统的示意图如下:编译器是将源语言程序一次性翻译成一个等价的,用目标语言编写的程序。还存在另一种常见的语言处理器,解释器:它是逐个语句的执行源语言程序。由一个编译器产生的目标语言程序通常比一个解释器快,但解释器的错误诊断效果通常更好。Jav...

weixin_39853892的博客 352

没了IDE,你的Java项目还能Run起来吗~

计算机只能识别机器码0101...编程语言->能执行的机器码 需要经过 预处理->编译->汇编->链接->机器码过程。一个语言处理系统的示意图如下:编译器 ...

weixin_44747933的博客 137

手动编写JDK动态代理

今天刚好讲了JDK动态代理,于是想自己写个JDK动态 首先看下JDK动态代理源码中的Proxy类中的newProxyInstance方法中所需要的参数 public static Object newProxyInstance(ClassLoader loader, Class<?>[] interf...

weixin_43888829的博客 243

class文件简介及加载

  Java编译器编译好Java文件之后,产生.class 文件在磁盘中。这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码。JVM虚拟机读取字节码文件,取出二进制数据,加载到内存中, 解析.class 文件内的信息,生成对应的 Class对象:         class字节码文件是根据JVM虚拟机规范中规定的字节码组织规则生成的、具体class文件是怎样...

weixin_33690963的博客 135

【亲测免费】 JD-Eclipse插件安装与配置完全指南

JD-Eclipse是一款专为Eclipse平台设计的Java反编译插件。它使得开发者在调试过程中能够查看所有的Java源代码,即便这些源码原本并不具备。此项目基于GNU GPL v3许可证发布,核心功能是无需原始源文件即可显示类文件对应的Java源代码。项目采用的主要编程语言是Java。 ## 关键技术和框架 - **核心技术**:本插件的核心在于其Java字节码解析引擎,实现了将已编译的.c...

gitblog_07305的博客 836

java基础之初步了解(视频笔记)

1.发展历史等略。 2.java核心优势:跨平台(也叫“可移植性”)。 3.java先编译后解释:源文件-->编译成字节码文件-->类加载器-->字节码校验-->解释器-->系统平台,所以java源文件和操作系统底层,是通过虚拟机JVM连接起来的,不同平台的JVM不同,可以将这理解为跨平台的原理。 4.配置环境变量PATH:先加系统变量JAVA_HOME=jdk...

m0_37996243的博客 143

笔记-编程语言实现模式(Language Implementation Patterns)

主要思想:文件读取部分对输入内容进行“识别”,并输出数据结构作为中间表示(intermediate representation,IR),供其他部件使用。流水线的末端是生成器,会根据IR及之前所收集到的信息进行计算,并输出最终所需的结果。那么这之间的过程就是进行语义分析。

vivisoul的专栏 1427

java字节码

Java之所以可以“一次编译,到处运行”,一是因为JVM针对各种操作系统、平台都进行了定制,二是因为无论在什么平台,都可以编译生成固定格式的字节码(.class文件)供JVM使用。因此,也可以看出字节码对于Java生态的重要性。之所以被称之为字节码,是因为字节码文件由十六进制值组成,而JVM以两个十六进制值为一组,即以字节为单位进行读取。

zhangjunli的博客 2555
上一篇: JVM类加载器子系统与SPI
下一篇: JVM的内存模型
Life  journey
博客等级 码龄17年 1万+粉丝 80原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值