字节码

字节码对象的理解

五迷三道 提交于 2020-01-30 17:59:31
Class是把所有类封装为一个Class 类,一个个.class文件就是一个Class对象。 搞清楚万物皆对象,类也可以是对象。 你写的一个类例如是Person,那么字节码就是这个类的另一种存在形式 因为jvm不能直接运行你写的类 所以需要转换 ,就好像你是人 ,你如果想飞,就把你变成鸟,这样你以鸟的状态存在 就可以飞了 ,字节码就是这样 把你写的这个类以字节码的形式扔给jvm 让他去运行,所以这个字节码就是类 。 这个面向对象 ,就跟修仙一样,java之父说:啊 ,一切***是对象。我们只能说:你说的都对,然后java之父就跟上帝似的创造了一个jvm虚拟机来作为所有产生对象的马达。 对象在类中产生,那么类(字节码,在虚拟机中就叫字节码)在哪产生呢。答案是java中的Class(java.lang.Class) . 那么在装进虚拟机的时候 这时候的类就叫字节码了 这些个字节码***归属于这个Class ,是他的对象,所以我们就叫这个时候字节码是字节码对象 来源: CSDN 作者: __MAC 链接: https://blog.csdn.net/weixin_46209120/article/details/104114992

获取类的字节码的Class对象。

喜欢而已 提交于 2020-01-30 12:38:54
获取类的字节码的Class对象。 以Person类为例: public class Person { private String name; private int age; public String a; protected int b; int c; private int d; public Person(String name, int age) { this.name = name; this.age = age; } public Person() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void eat(String str){ System.out.println(str); } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", a='" + a + '\'' + ", b="

java内存模型

江枫思渺然 提交于 2020-01-30 04:32:40
关于内存模型网上资源简直不要太多,此文根据自己的理解总结了一下 博客小白,文章为原创,里面一些个人的观点可能不太准确或严谨,若有问题欢迎各路大神批评指正 首先是上图: java的内存可大范围分为两类: 一、线程隔离(线程私有): 所谓线程隔离也就是说这个区域的内存各个线程间相互独立,互不影响 1. 程序计数器(program counter register): 是一块比较小的内存空间,作用可以看做是当前线程执行字节码的行号指示器 在虚拟机的概念模型里,字节码解释器就是通过改变计数器的值来选取下一条要执行的字节码 比如分支,循环,跳转,异常处理等 说的简单些就是用来控制程序的走向; 一个处理器在一个时间只会处理一条线程中的指令,因此每条线程都会有一个单独的程序计数器,各个线程间互不影响 如果线程正在执行一段java方法,那么计数器记录的就是虚拟机指令的的地址; 如果执行的是native方法,计数器的值为空(Undefined) 程序计数器是java内存模型中唯一不会出现outOfMemory的地方 2. 虚拟机栈(java virtual machine stacks) 虚拟机栈也就是我们一般常说的栈 每个方法被执行的时候都会同时创建一个栈帧,用于存储局部变量表,操作栈,动态链接,方法出口等 每一个方法被执行到结束的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程

java常用类---Object类

别说谁变了你拦得住时间么 提交于 2020-01-30 02:35:37
1.API概述以及Object类的概述 A:API(Application Programming Interface) 应用程序编程接口 B:Java API 就是Java提供给我们使用的类,这些类将底层的实现封装了起来, 我们不需要关心这些类是如何实现的,只需要学习这些类如何使用。 C:Object类概述 类层次结构的根类 所有类都直接或者间接的继承自该类 D:构造方法 public Object() 回想面向对象中为什么说: 子类的构造方法默认访问的是父类的无参构造方法 2.Object类的hashCode()方法 public int hashCode() a:返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。 b:不同对象的,hashCode()一般来说不会相同。 但是,同一个对象的hashCode()值肯定相同。 c:不是对象的实际地址值,可以理解为逻辑地址值。 public class MyTest { public static void main ( String [ ] args ) { // java.lang 这个包下的类,可以不用导包 // 类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。 //Object 是一个顶层父类,所有类,都是直接或间接继承自他 // 空参构造

GO数值转换方法汇总

巧了我就是萌 提交于 2020-01-29 07:07:16
1.数值字母转整型值 strconv.Atoi("3") 2.整型值转字符 strconv.Itoa(3) 3.字符串转字节码 bytes := []byte("12345678") 4.字节码转字符串 str := fmt.Sprintf("%x", bytes) str := string(bytes) import "encoding/hex" str := hex.EncodeToString(bytes) 5.int64与字节码 func Int64ToBytes(value int64) []byte { var bytes = make([]byte, 8) binary.BigEndian.PutUint64(bytes, uint64(value)) return bytes } func BytesToInt64(bytes []byte) uint64 { return int64(binary.BigEndian.Uint64(bytes)) } func BytesNtohll(b []byte) uint64 { return uint64(b[0])<<56 | uint64(b[1])<<48 | uint64(b[2])<<40 | uint64(b[3])<<32 | uint64(b[4])<<24 | uint64(b[5])<<16 |

JVM加载class文件的原理机制

萝らか妹 提交于 2020-01-29 03:40:27
Java的编译和平台独立性    首先Java是平台独立性语言(C/C++就不是,java一次编译在各个平台上都能执行),这关键就在它的"字节码"和JVM机制。Java程序编译后不是直接生成硬件平台的可执行代码,而是生成.class的字节码文件,再交由JVM翻译成对应硬件平台可执行的代码。 (也就是说.java文件被javac指令编译为.class的字节码文件,再由JVM执行)。   Java字节码的执行分为:即时编译和解释执行,通常采用解释执行方式。解释执行是指解释器通过每次解释并执行一小段代码来完成.class程序的所有操作。即时编译则是将.class文件翻译成机器码在执行。 类的加载机制   Java语言是一种具有动态性的解释性语言,类(Class)只有被加载到JVM中在能运行。   JVM会将编译生成的.class文件加载到内存中,并组织成为一个完整的Java程序。 这个加载过程则是由类加载器(ClassLoader和它的子类)来完成的,其实质是把类文件从硬盘读到内存中。   类的加载方式分为:     (1)隐式加载:程序使用new等方式创建对象,会隐式的调用类加载器。     (2)显式加载:直接调用class.forName()方法   在Java中类的加载是动态的,它不会一次性记载所有类然后运行,而是先把保证程序能运行的基类先加载到JVM中,其他类则是在需要时再加载

Java解释执行和编译执行

最后都变了- 提交于 2020-01-29 01:52:46
首先,我们先解释一下在Java中解释执行和编译执行的区别。  解释执行:将编译好的字节码一行一行地翻译为机器码执行。 编译执行:以方法为单位,将字节码一次性翻译为机器码后执行。      在编译示时期,我们通过将源代码编译成.class ,配合JVM这种跨平台的抽象,屏蔽了底层计算机操作系统和硬件的区别,实现了“一次编译,到处运行” 。 而在运行时期,目前主流的JVM 都是混合模式(-Xmixed),即解释运行 和编译运行配合使用。   以 Oracle JDK提供的HotSpot虚拟机为例,在HotSpot虚拟机中,提供了两种编译模式:解释执行 和 即时编译(JIT,Just-In-Time)。解释执行即逐条翻译字节码为可运行的机器码,而即时编译则以方法为单位将字节码翻译成机器码(上述提到的“编译执行”)。前者的优势在于不用等待,后者则在实际运行当中效率更高。   即时编译存在的意义在于它是提高程序性能的重要手段之一。根据“二八定律”(即:百分之二十的代码占据百分之八十的系统资源),对于大部分不常用的代码,我们无需耗时间将之编译为机器码,而是采用解释执行的方式,用到就去逐条解释运行;对于一些仅占据小部分的热点代码(可认为是反复执行的重要代码),则可将之翻译为符合机器的机器码高效执行,提高程序的效率,此为运行时的即时编译。   为了满足不同的场景

python安装和基本规则(1)

冷暖自知 提交于 2020-01-29 01:12:16
** python安装和基本规则(1) 1.python 安装 打开 python官网 后按指引选择window,max等进行下载。注意python2版本和3版本差距较大,建议使用3版本,因为现阶段主要流行的为3版本,2版本和3版本存在部分语法上的不同。在选择具体版本时并无较大差异但是注意尽量不要选择版本较低或者太高版本,较低版本部分功能未加入而较高版本部分功能可能存在问题。 在安装阶段点击next即可,只是需注意环境配置的为题,会有一步询问安装者是否配置,点击添加确定即可。 2 python 代码的运行规则 python作为高级语言需要通过解释器将代码编译为字节码,生产 .pyc文件,再将字节码转化成二进制机械码控制计算机运行。其中解释器将python解释为字节码,字节码有python的字节码,同时也存在java等的字节码(在特殊情况下可以将python代码转化成Java的字节码) 3 python 的优点 *****软件质量 开发效率 可移植性 库支持多***** (总的来说,方便,简单,使用,以及其他) 4 python的使用方式 python大体存在脚本和交互的编写模式,在交互编写中,主流为用户通过打开控制台进入python进行操作。而进行脚本操作时,通过整段代码编写完成后保存使用,这里作者推荐使用phcharm或者sublime进行编写后运行。相比较而言

字节码增强

和自甴很熟 提交于 2020-01-28 20:10:47
之前看了美团技术团队推送的一篇文章,介绍了字节码增强技术,可的很好,自己也记录一下,增强一下记忆,也方便日后巩固学习,有兴趣的可以去搜索美团技术团队的原文 字节码是JVM的底层基础知识,如果能够掌握对于排查问题会有更深层次的理解 1.什么是字节码 首先我们看看什么是字节码,找到一个.class文件,看看长什么样子 Java之所以可以一次编译,到处运行,首先是因为JVM针对各种操作系统和平台都进行了定制,二是无论在什么平台,都可以通过javac命令将一个.java文件编译成固定格式的字节码(.class文件)供JVM使用 之所以被称之为字节码,是因为.class文件是由十六进制值组成的,JVM以两个十六进制值为一组,就是以字节为单位进行读取 2.字节码的结构 .java文件编译后生成的字节码文件,打开如上图,JVM对字节码是有规范要求的,要求每一个字节码文件都要有十部分按照固定的顺序组成,整体的结构和顺序如下图: (1)魔数 所有的.class文件的前4个字节都是魔数,魔数以一个固定值:0xCAFEBABE,放在文件的开头,JVM就可以根据这个文件的开头来判断这个文件是否可能是一个.class文件,如果是这个开头,才会往后执行下面的操作 一直困惑的java的图标为什么是一杯咖啡,看到这里就大概明白了,这个魔数的固定值是Java之父James Gosling指定的,意为CafeBabe

Leader:这样的 Bug 你也写的出来???

做~自己de王妃 提交于 2020-01-28 15:42:16
Hello~各位读者新年好!不知道大家春节假期是否已延长,小黑哥刚接到通知,假期延长到 2 月 2 号,另外回去之后需要在家办公,自行隔离两周。还没试过在家办公,小黑哥就怕到时候生物钟还没调整过来,一觉睡醒已经是下午了。。。 前言 春节假期,还躺在床上小黑哥,收到对账系统的一条预警短信,提示当前系统资金核对存在问题。关于资金的问题,都是大问题,小黑哥连忙拔出电脑,连上 VPN,登录生产环境的查看相关日志。 通过日志,很快小黑哥定位到相关代码。 有的同学可能一下子就能看出这里的问题, Long 对象采用 != 进行比较,这真是一个低级 Bug 。幸好 Leader 还不知道,赶紧悄悄修复一下。 现在回想小黑哥当初写这段代码的时候,误以为两个 Long 对象比较将会进行自动拆箱,转变为两个基本数值类型比较。 下面开始复习一下 Java 自动装箱与拆箱机制。 自动装箱与拆箱机制 自动装箱(Autoboxing),是 JDK5 新增的一种语法糖,将会在代码编译时自动将原始类型转换为其对应的对象包装器类。例如将 int 转换为 Integer , double 转换为 Double 。如果转换结果相反,我们就将其称为拆箱。 下面是一个自动装箱的例子: 上面代码 li.add(i) 就发生自动装箱,将基本数据类型 long 转换为其包装类 Long 。 查看这段代码对应的字节码。