IllegalAccessError异常: Exception in thread "main" java.lang.IllegalAccessError: tried to access class i t.businesslogic.ireport.plugin.checkupdate.CheckUpdate$1 from class it.businessl ogic.ireport.plugin.checkupdate.CheckUpdate at it.businesslog…
虚拟机每次方法的调用和返回都伴随着栈帧的入栈和出栈,而每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用(表明该栈帧执行的是哪个方法),持有这个引用是为了支持方法调用中的动态连接.这些符号引用中一部分会在类加载阶段或者第一次使用的时候转换成直接引用(即在验证.准备.解析的解析阶段,比如说类中的静态方法.私有方法以及final修饰的方法,在编译期就可以明确调用的版本,而不会产生歧义),这种转换称为静态解析:另外一部分将在每一次的运行期间转化为直接引用,这部分称为动态连接. 方法返回包含正常完…
一.前言 前面分析了class文件具体含义,接着需要将class文件加载到虚拟机中,这个过程是怎样的呢,下面,我们来仔细分析. 二.什么是类加载机制 把class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是类加载机制. 三.类加载总体流程图 说明:类的整个生命周期分为以上七个阶段,验证.准备.解析统称为连接阶段.关于加载流程笔者之前也写过一篇文章JVM之类加载器,从代码层面了解类加载机制.下面我们将更加详细的讲解各个阶段,加载阶段只是类加…
从字节码层面来看,Java中的所有方法调用,最终无外乎转换为如下几条调用指令. invokestatic: 调用静态方法. invokespecial: 调用实例构造器<init>方法,私有方法和父类方法. invokevirtual: 调用所有的虚方法. invokeinterface: 调用接口方法,会在运行时再确定一个实现此接口的对象. invokedynamic: 调用动态方法.JDK 7引入的,主要是为了支持动态语言的方法调用. JVM提供了上述5条方法调用指令,所以不妨从字节码层面…
类加载的过程包括: 加载class到内存,数据校验,转换和解析,初始化,使用using和卸载unloading过程. 除了解析阶段,其他过程的顺序是固定的.解析可以放在初始化之后,目的就是为了支持动态加载. 从java开发者来讲,我们并不关心具体细节,只要知道整个流程以及每个流程大体干了那些事情. 每个流程具体对开发代码会有那些影响就可以了. 类的加载流程 1.加载loading 在加载过程中,虚拟机需要完成3件事情: 1)通过一个类的全限定名来获得此类的二进制字节流. 2)将这个直接流的静态存…
类文件及类加载机制 标签(空格分隔): Java 本篇博客的重点是分析JVM是如何进行类的加载的,但同时我们会捎带着说一下Class类文件结构,以便对类加载机制有更深的理解. 类文件结构 平台无关性 众所周知,Java是平台无关的语言,那么是如何实现平台无关的呢? Java程序要在Java虚拟机(JVM)上运行,而JVM并不与包括Java在内的任何语言绑定,它只与"Class文件"这种特定的二进制文件格式所关联. 也就是说,任何语言,只要可以编译成符合某种特定规则的Class文件,都可…
一.概述 二.栈帧结构 三.方法调用 四.方法执行       一.概述 虚拟机与物理机 虚拟机是一个相对于物理机的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器.硬件.指令集和操作系统层面上的,而虚拟机的执行引擎则是由自己实现的,因此可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式.   概念模型与实现(解释执行/编译执行). 从模型(外观)看:输入字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果. 从实现看:可能解…
类加载的过程 一.加载 在加载阶段虚拟机需要完成以下三件事: 通过一个类的全限定名称来获取此类的二进制字节流 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口 这三件事在Java虚拟机中并没有说的很详细,比如类的全限定名称是如何加载进来的,以及从哪里加载进来的.通常来讲,一个类的全限定名称可以从zip.jar包中加载,也可以从网络中获取,也可以在运行的时候生成(这点最明显的技术体现就…
上节学习回顾 上一节,我们深入到类文件去了解其结构细节,也大概对类文件的编写规则略知一二了,解析来我们就得学习这个类文件是如何被加载到Java虚拟机的,看看有什么引人入胜的奥秘. 本节学习重点 大部分计算机类科生都应该有接触过C语言,C语言的编译过程会有预处理.编译.汇编.链接四个步骤,经过了这四个步骤就生成了可以执行文件(二进制机器码).Java同样如此, 有Java使用经验的伙伴都应该知道,类加载有加载.连接.初始化三个阶段,这就是虚拟机类加载的三大步骤,只有经过了这三大步骤才能在Java虚…
写在前面: 之所以称作不完全总结,因为我其实没有完完全全地看完此书,但是涵盖了大部分重要章节:同时以下总结是我自己认为很重要知识,细枝末节处难免遗漏,还请详细参考原著. 转载请注明原文出处:http://www.cnblogs.com/qcblog/p/7704788.html 1.java内存区 1.1.运行时数据区 程序计数器是线程隔离的内存空间,并且是规范中唯一一个没有规定OutOfMemoryError的区域. 虚拟机栈也是是线程隔离的区域,方法的调用以栈帧为单位,在虚拟机栈中入栈和出栈…