虚拟机(系列四)
xinjing_wangtao
这个作者很懒,什么都没留下…
展开
-
Java中的类加载器
首先声明,我是因为看了ImportNew网站上的几篇关于类加载器的文章之后,才萌生了写这篇文章的想法。所以在写这篇文章时,参考了该网站上的几篇相关的文章,但是加入了很多自己的理解,绝对不是抄袭。从java的动态性到类加载机制我们知道,java是一种动态语言。那么怎样理解这个“动态”呢?或者说一门语言具备了什么特性,才能称之为动态语言呢?对于java,我是转载 2016-08-24 15:12:49 · 198 阅读 · 0 评论 -
Class文件格式实战:使用ASM动态生成class文件
概述本专栏前面的文章,主要详细讲解了Class文件的格式,并且在上一篇文章中做了总结。 众所周知, JVM在运行时, 加载并执行class文件, 这个class文件基本上都是由我们所写的java源文件通过javac编译而得到的。 但是, 我们有时候会遇到这种情况:在前期(编写程序时)不知道要写什么类, 只有到运行时, 才能根据当时的程序执行状态知道要使用什么类。 举一个常见的例子就转载 2016-08-25 21:21:26 · 1614 阅读 · 0 评论 -
Class文件格式总结
到此, 所有关于class文件格式的重要内容都已经讲解完了, 不敢说面面俱到, 但是敢说大部分重要的内容都包含在内了。前前后后用了9篇博客来专门讲解class文件结构, 为什么花那么多的时间和精力来介绍class文件呢? 简而言之,因为它很重要。在前面的文章中, 也讲到过为什么对于理解Java体系结构来说, 理解class文件的格式至关重要。 其实这篇短文也不是对class文件格式细节上的总结,转载 2016-08-25 21:21:06 · 280 阅读 · 0 评论 -
深入理解Java Class文件格式(九)
经过前八篇关于class文件的博客, 关于class文件格式的内容也基本上讲完了。 本文是关于class文件格式的最后一篇。 在这篇博客中, 将会讲解关于方法的几个属性。 理解这篇博客的内容, 对于理解JVM执行引擎起着重要作用。 关于虚拟机执行引擎有关的内容, 会在本专栏后面的博客中涉及。 在前面几篇博客中, 我们知道在class文件中描述一个方法, 会使用一个method_转载 2016-08-25 21:20:40 · 383 阅读 · 0 评论 -
深入理解Java Class文件格式(八)
在本专栏的第一篇文章 深入理解Java虚拟机到底是什么 中, 我们主要讲解了什么是虚拟机, 这篇博客是对JVM的一个概述。 在随后的几篇文章中,一直在讲解class文件格式。 在今天这篇博客中, 将会继续讲解class文件中的其他信息。 在本文中, 将会讲解class文件中的最后一部分, 属性(attributes) 。 这里的属性和源文件中的属性不是一个概念。 在源文件中, 我们把在类中定义转载 2016-08-25 21:20:07 · 338 阅读 · 0 评论 -
深入理解Java Class文件格式(七)
本专栏列前面的一系列博客, 对Class文件中的一部分数据项进行了介绍。 本文将会继续介绍class文件中未讲解的信息。 先回顾一下上面一篇文章。 在上一篇博客中, 我们介绍了:this_class 对当前类的描述super_class 对当前类的超类的描述interfaces_count 当前类直接实现的接口的数量或当前接口直接继承的接口的数量interface转载 2016-08-24 15:22:35 · 310 阅读 · 0 评论 -
深入理解Java Class文件格式(六)
经过前几篇文章, 终于将常量池介绍完了, 之所以花这么大的功夫介绍常量池, 是因为对于理解class文件格式,常量池是必须要了解的, 因为class文件中其他地方,大量引用了常量池中的数据项。 对于还不了解常量池的读者, 如果想要深入了解class文件格式, 或者想继续读这篇博客和本专栏以后的博客, 那么我建议先把我前面的几篇博客读一下,把常量池的结构熟悉一下, 对于理解后面的内容很有帮助。转载 2016-08-24 15:22:13 · 268 阅读 · 0 评论 -
深入理解Java Class文件格式(五)
前情回顾本专栏的前几篇博文, 对class文件中的常量池进行了详细的解释。 前文讲解了常量池中的7种数据项, 它们分别是:CONSTANT_Utf8_infoCONSTANT_NameAndType_infoCONSTANT_Integer_infoCONSTANT_Float_infoCONSTANT_Long_infoCONSTANT_Double_info转载 2016-08-24 15:21:43 · 411 阅读 · 0 评论 -
深入理解Java Class文件格式(四)
前情回顾在上一篇博客深入理解Java Class文件格式(三) 中, 介绍了常量池中的两种类型的数据项, 分别是CONSTANT_Utf8_infoCONSTANT_NameAndType_info 。CONSTANT_Utf8_info中存储了几乎所有类型的字符串, 包括方法名, 字段名, 描述符等等。 而CONSTANT_NameAndType_info是方转载 2016-08-24 15:21:15 · 422 阅读 · 0 评论 -
深入理解Java Class文件格式(三)
首先, 让我们回顾一下关于class文件格式的之前两篇博客的主要内容。 在 深入理解Java Class文件格式(一) 中, 讲解了class文件在整个java体系结构中的位置和作用, 讲解了class文件中的魔数和版本号相关的信息, 并且对常量池进行了概述。 在 深入理解Java Class文件格式(二) 中, 主要讲解了class文件中的特殊字符串, 包括类的全限定名, 字段描述符和方转载 2016-08-24 15:20:18 · 370 阅读 · 0 评论 -
深入理解Java Class文件格式(二)
在上一篇文章 深入理解Java Class文件格式(一) 中, 介绍了class文件在整个java体系结构中的位置和作用, 并对class文件的整体格式做了说明, 介绍了其中的魔数和版本号的相关内容, 并对常量池做了概述。 在本文章, 继续介绍class文件中的其他内容。class文件中的特殊字符串首先说明一下, 所谓的特殊字符串出现在class文件中的常量池中,转载 2016-08-24 15:19:40 · 318 阅读 · 0 评论 -
深入理解Java Class文件格式(一)
Class文件在Java体系结构中的位置和作用在上一篇博客中, 大致讲解了Java虚拟机的体系结构和执行原理。 本篇博客主要讲解能够被JVM识别, 加载并执行的class文件的格式。对于理解JVM和深入理解Java语言, 学习并了解class文件的格式都是必须要掌握的功课。 原因很简单, JVM不会理解我们写的Java源文件, 我们必须把Java源文件编译成转载 2016-08-24 15:19:08 · 292 阅读 · 0 评论 -
深入理解Java虚拟机到底是什么
什么是Java虚拟机作为一个Java程序员,我们每天都在写Java代码,我们写的代码都是在一个叫做Java虚拟机的东西上执行的。但是如果要问什么是虚拟机,恐怕很多人就会模棱两可了。在本文中,我会写下我对虚拟机的理解。因为能力所限,可能有些地方描述的不够欠当。如果你有不同的理解,欢迎交流。我们都知道java程序必须在虚拟机上运行。那么虚拟机到底是什么呢?先看网上搜索到的比较靠谱的转载 2016-08-24 15:17:07 · 407 阅读 · 0 评论 -
深入理解Java中为什么内部类可以访问外部类的成员
内部类简介虽然Java是一门相对比较简单的编程语言,但是对于初学者, 还是有很多东西感觉云里雾里, 理解的不是很清晰。内部类就是一个经常让初学者感到迷惑的特性。 即使现在我自认为Java学的不错了, 但是依然不是很清楚。其中一个疑惑就是为什么内部类对象可以访问外部类对象中的成员(包括成员变量和成员方法)? 早就想对内部类这个特性一探究竟了,今天终于抽出时间把它研究了一下。转载 2016-08-24 15:16:21 · 278 阅读 · 0 评论 -
深入理解为什么Java中方法内定义的内部类可以访问方法中的局部变量
开篇在我的上一篇博客 深入理解Java中为什么内部类可以访问外部类的成员 中, 通过使用javap工具反编译内部类的字节码, 我们知道了为什么内部类中可以访问外部类的成员, 其实是编译器在编译内部类的class文件时,偷偷做了一些工作, 使内部类持有外部类的引用, 并且通过在构造方法上添加参数注入这个引用, 在调用构造方法时默认传入了外部类的引用。 我们之所以感到疑惑, 就是因为编译转载 2016-08-24 15:15:28 · 466 阅读 · 0 评论 -
详解Java中的clone方法 -- 原型模式
Java中对象的创建clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建对象呢?1 使用new操作符创建一个对象2 使用clone方法复制一个对象那么这两种方式有什么相同和不同呢? new操作符的转载 2016-08-24 15:14:29 · 325 阅读 · 0 评论 -
Java中的String为什么是不可变的? -- String源码分析
什么是不可变对象?众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。区分对象和对象的引用对于Ja转载 2016-08-24 15:13:46 · 278 阅读 · 0 评论 -
Java中数组的特性
数组是基本上所有语言都会有的一种数据类型,它表示一组相同类型的数据的集合,具有固定的长度,并且在内存中占据连续的空间。在C,C++等语言中,数组的定义简洁清晰,而在java中确有一些会让人迷惑的特性。本文就尝试分析这些特性。Java中的数组是对象吗?Java和C++都是面向对象的语言。在使用这些语言的时候,我们可以直接使用标准的类库,也可以使用组合和继承等面向对象的特性转载 2016-08-24 15:13:17 · 286 阅读 · 0 评论 -
深入理解Java运行时数据区
前情回顾在本专栏的前12篇博客中, 我们主要大致介绍了什么是JVM, 并且详细介绍了class文件的格式。 对于深入理解Java, 或者深入理解运行于JVM上的其他语言, 深入理解class文件格式都是必须的。 如果读者对class文件的格式不是很熟悉, 在阅读本博客下面的文章之前, 建议先读一下前面的12篇博客, 或者参考其他资料, 熟悉class文件的格式。转载 2016-08-25 21:22:23 · 335 阅读 · 0 评论