字节码

类文件结构

北城余情 提交于 2020-02-17 06:46:55
1. 概述   计算机只认识0和1,所以我们写的程序需要经过编译器翻译成0和1构成的二进制格式才能由计算机执行,现在越来越多的程序语言选择了与操作系统和机器指令集无关的、平台中立的格式作为程序编译后的存储格式。各种不同平台的虚拟机与所有平台都统一使用的程序存储格式--字节码,是构成平台无关性的基石。同时Java虚拟机也在发展语言无关性,目前java虚拟机之上可以运行的语言有:Clojure、Groovy、JRuby、Jython和Scala等。实现语言无关性的基础仍然是虚拟机和字节码存储格式,java虚拟机不和包括java在内的任何语言绑定,它只和“Class文件“这种特定的二进制文件格式所关联,Class文件中包含了java虚拟机指令集和符号表以及若干辅助信息。Class文件是java虚拟机执行引擎的数据入口。 2.Class类文件的结构   Class文件是一组以8位字节为基础单位的二进制流。Class文件只有2种数据类型:无符号数和表。   无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成的字符串值。   表是由多个无符号数或者其它表作为数据项构成的复合数据类型。   (1) 魔数与Class文件的版本    

类文件结构简介

旧街凉风 提交于 2020-02-17 06:46:36
理解类加载机制的基础 类文件结构 java编译后会生成字节码文件(*.class,即类文件),其之所以能够“一次编写,到处运行”是因为字节码文件时平台无关的,这些类文件被各个平台上的虚拟机加载执行,即 字节码平台无关,虚拟机平台相关 。 任何一个 .class文件对应一个类/接口,但是类/接口可能通过 类加载器 直接生成,不一定定义在 .class文件中。 1.1 类文件结构 *.class 文件是一组8位为基础单位的二进制流(4位标识一个16进制数,所以两个16进制数标识一个8位)。如果一个数据项需要一个以上的8位存储空间,则按照高位在前big-endian的方式使用若干个8位进行存储。 数据类型 Class文件有两种数据类型: 无符号数:基本数据类型,u1/u2/u4/u8分别代表1/2/4/8个字节的无符号数,用来描述数字、索引引用、数量之和按照utf-8编码构成的字符串值。 表:有多个无符号数和其他表组成的复合数据类型,以“_info”结尾。用于描述有层次关系的复合结构的数据。 class文件结构 class文件本质就是一张表,构成class文件的数据项如图所示: 描述同一类型但是数量不定的多个数据时,经常使用一个前置的容量计数器加若干个连续的数据项的形式——称这一系列连续的数据为某一类型的集合。 如下代码编译: package org.fenixsoft.clazz;

java 工具的开发及应用

我怕爱的太早我们不能终老 提交于 2020-02-16 22:53:37
在真实开发中如果使用文本编辑工具进行开发,基本上是不可能的,原因是开发效率太低如何提高开发效率? 使用IDE,集成开发环境使用IDE工具常见的工具有Eclipse、IDEA、STS/MyEclipseEclipse中的开发步骤:1、File—new --java project构建java项目 2、src目录用于存放源代码 3、右键点击src–new—class 4、IDE工具会根据向导中的设置自动生成对应的class代码结构 5、在IDE工具中输入java代码,从而进行编程 6、输入完毕按【ctrl+s】进行保存,保存时IDE工具会自动进行编译形成.class字节码文件 7、在含有main方法的类上右键–run—java Application,则自动会执行java程序,执行结构会显示在Console视图窗口中首先将源代码编译成二进制字节码(bytecode 不是机器语言),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了Java程序的性能Java主要技术分支 JavaSE:Java标准版,适合于开发桌面系统和低端商务应用系统 前身J2SE,2005年之后更名JavaSE Java 语言核心类: 数据库连接, 接口定义,输入/输出和网络编程 JavaEE

Cglib动态代理

*爱你&永不变心* 提交于 2020-02-16 21:32:49
JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。 委托类: package com.reflect.proxy; public class GunDog1 { public void info() { System.out.println("我是一只美丽的猎狗"); } public void run() { System.out.println("我非常的奔跑迅速"); } } 通用的方法: package com.reflect.proxy; public class DogUtil { public void method1(){ System.out.println("=====模拟第1个通用方法======"); } public void method2(){ System.out.println("=====模拟第2个通用方法======"); } } 代理类“: interceptor(Object obj,Method method,Object[] args ,MethodProxy

Java连载3-编译与运行阶段详解&JRE,JDK,JVM关系

空扰寡人 提交于 2020-02-16 14:28:57
·一、 1.JDK下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk12-downloads-5295953.html 二、Java的加载与执行 1.Java程序运行包括: (1)编译阶段:检查Java源程序是否符合Java语法,符合语法就生成正常的字节码文件(xxxx.class),字节码文件中不是纯粹的二进制,这种文件无法在操作系统中直接执行 i.需要用JDK中自带的javac.exe命令进行java程序编译 ii.用法:doc窗口,规则:javac java源程序路径 iii.javac是一个java编译工具 iv.一个java程序可以编译生成多个.class文件 v.字节码文件是最终要执行的文件,所以说class文件生成之后,java源文件删除并不会影响java程序的执行。 vi.编译结束之后,可以将.class文件拷贝到其他操作系统中执行。 (2)运行阶段:JDK安装之后,除了自带一个javac.exe之外,还有另一个工具/命令,java.exe负责运行阶段 java.exe在dos窗口使用,规则为: 例如:存在一个文件A.class,则命令为:java A 注意:不要写为:java A.class,且不要接文件地址,接的是类名 运行过程: i.Dos窗口 ii.输入 java A iii

what‘s java

泪湿孤枕 提交于 2020-02-16 14:28:04
目录 what‘s java 一、java简介 1.简介 2.版本 3.应用领域 二、java特点 1.跨平台 2.简单 3.安全 4.健壮 5.完全面向对象 三、跨平台 四、java环境变量 1.环境变量的操作 2.配置Java环境变量 3.jdk jre jvm分别是什么以及之间的关系 五、我的第一行代码 what‘s java 一、java简介 1.简介 java 是1995年sun公司推出的面向对象程序设计语言。起初 oak(橡树)。 java是一种跨平台,实现“一次编译,到处执行”。 java适用于网络环境,是internet最受欢迎的编程语言之一。 java程序可在计算机、pad、手机、电视电话等电子设备上运行。 2.版本 javaSE (java stanstard edition )标准版,用于客户端桌面软件编程。 javaME(java micro edition) 微型版,用于嵌入式、pad 手机、电视、电话、编程。 javaEE(java enterprise edition)企业版,用于服务器端分布式网络程序,比如电商,erp系统。 3.应用领域 桌面应用系统开发、嵌入式开发、电子商务应用开发、web应用系统开发、多媒体系统开发、企业级交互式分布式系统开发。 二、java特点 1.跨平台 graph LR A[.java源码]-->|JVM编译器| B[

聊聊java平台哪些事

女生的网名这么多〃 提交于 2020-02-16 14:27:01
如果有人让你聊聊java平台,你会怎么说呢?java平台包括的东西太多了,有java语言,java类库,jvm,还有一些java常用到的框架 ...... ,简直说都说不过来,下面是我的一些见解,算是现阶段对java的一点总结,可以指导我向哪些方面前进。 (1)java语言 java语言是一门面向对象的编程语言,号称 Write once, run anywhere,书写一次,到处运行 。其实java语言本身和其它编程语言没什么区别,关键是jvm让java语言在不同的平台运行的环境而已。JRE是java的运行环境,JDK是JRE的超集,除了包括java的运行环境,还有java的开发环境以及一些诊断工具。我们想要运行java程序,首先就得安装JDK,这就给我们提供了一个统一的编程环境,而不用关心操作系统的差异性,只关注编程技术。 java有三大特性,封装,继承,多态 封装是将类的关键信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。 继承是使用已经存在的类来建立新类的技术,新类可以增加新的属性和方法,父类提供共性,子类提供特殊性。 多态是一个引用在不同情况下的多种状态。通过指向父类的指针,来调用不同子类的实现方法。 还有泛型,反射,Lambda ...... (2)java虚拟机(JVM) java语言实现运行的流程:编码->编译->运行

JDK JRE JVM

淺唱寂寞╮ 提交于 2020-02-16 13:08:58
使用java很久,但是一直不清楚JDK,JRE,JVM直接的关系,今天特地梳理一下。 JDK:Java Development ToolKit(Java开发工具包),JDK是整个JAVA的核心,包括Java运行环境(Java Runtime Environment),一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。 最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了属于自己的JDK,例如国外IBM公司开发了属于自己的JDK,国内淘宝也开发了属于自己的JDK,各个组织开发自己的JDK都是为了在某些方面得到一些提高,以适应自己的需求,比如IBM的JDK据说运行效率就比SUN的JDK高的多。但不管怎么说,我们还是需要先把基础的Sun JDK掌握好。 JDK有以下三种版本: J2SE,standard edition,标准版,是我们通常用的一个版本; J2EE,enterpsise edtion,企业版,使用这种JDK开发J2EE应用程序; J2ME,micro edtion,主要用于移动设备、嵌入式设备上的java应用程序。 我们常常用JDK来代指Java API,Java API是Java的应用程序接口,其实就是前辈们写好的一些java Class,包括一些重要的语言结构以及基本图形

关于 JDK jre jvm

∥☆過路亽.° 提交于 2020-02-16 12:56:23
JDK 全名是 JAVA development kit 是JAVA语言的软件开发工具 包;是整个JAVA开发的核心,没有JDK的话,无法编译Java程序,如果想只运行Java程序,要确保已安装相应的JRE。 JDK包含的基本组件包括: javac – 编译器,将源程序转成字节码; jar – 打包工具,将相关的类文件打包成一个文件; javadoc – 文档生成器,从源码注释中提取文档; jdb – debugger,查错工具; java – 运行编译后的java程序(.class后缀的); java.lang 这个是系统的基础类,比如String等都是这里面的,这个包是唯一一个可以不用引入(import)就可以使用的包。 java.io: 这里面是所有输入输出有关的类,比如文件操作等。 java.nio:为了完善io包中的功能,提高io包中性能而写的一个新包 ,例如NIO非堵塞应用 java.net: 这里面是与网络有关的类,比如URL,URLConnection等。 java.util: 这个是系统辅助类,特别是集合类Collection,List,Map等。java.spl: 这个是数据库操作的类,Connection, Statement,ResultSet等。 javax.servlet:这个是JSP,Servlet等使用到的类。 jre: JRE(Java

Java-内存区域

一曲冷凌霜 提交于 2020-02-16 06:38:09
对于Java程序员来说,在虚拟机的自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,而且不容易出现内存泄漏和内存溢出问题,看起来由虚拟机管理内存一切都很美好。不过,也正是因为Java程序员把内存控制的权力交给了Java虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那排查错误将会成为一项异常艰难的工作。 ————《深入浅出Java虚拟机》 程序计数器Program Counter Register 程序计数器是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号解释器。 在虚拟机的概念模型中,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)只会执行 一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“ 线程私有 ”的内存。 Java虚拟机栈Java Virtual Machine Stacks Java虚拟机栈也是 线程私有 的