字节码

JVM类加载机制

核能气质少年 提交于 2019-12-02 02:14:19
jvm的类加载机制 一.类加载的时机 类从被加载到虚拟机内存中开始,到卸载出内存为止,他的整个生命周期包括了:加载,验证,准备,解析,初始化,使用和卸载七个阶段。其中验证,准备和解析三个部分统称为连接。 加载,验证,准备,初始化和卸载这五个阶段的顺序是确定的,而解析阶段不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持java的动态绑定。 注意: 1.加载。虚拟机规范中并没有进行强制约束,这点可以交给虚拟机的具体实现来自由把握。但是对于初始化阶段,虚拟机规范严格规定了有且只有四种情况必须立即对类进行初始化(而加载,验证,准备最自然需要在此之前开始) 情况1:遇到new,getstatic,putstatic或invokestatic这4条字节码指令时,如果类没有进行过初始化,则需要先出发初始化(对应场景就是使用new实例化对象的时候,读取或设置一个类的静态字段(被final修饰,已在编译期把结果放入常量池的静态字段除外)的时候,以及调用一个类的静态方法的时候)。 情况2:使用java.lang.reflect包的方法对类进行反射调用的时候 情况3:当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。 情况4:当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。

Java虚拟机:源码到机器码

▼魔方 西西 提交于 2019-12-01 19:51:00
目录 前端编译器:源代码到字节码 JIT编译器:从字节码到机器码 AOT编译器:源代码到机器码 总结 转载 无论什么语言写的代码,其到最后都是通过机器码运行的,无一例外。那么对于 Java 语言来说,其从源代码到机器码,这中间到底发生了什么呢?这就是今天我们要聊的。 如下图所示,编译器可以分为:前端编译器、JIT 编译器和AOT编译器。下面我们逐个讲解。 前端编译器:源代码到字节码 对于 Java 虚拟机来说,其实际输入的是字节码文件,而不是 Java 文件。那么对于 Java 语言而言,其实怎么将 Java 代码转化成字节码文件的呢?我们知道在 JDK 的安装目录里有一个 javac 工具,就是它将 Java 代码翻译成字节码,这个工具我们叫做编译器。相对于后面要讲的其他编译器,其因为处于编译的前期,因此又被称为前端编译器。 我们运行 javac 命令的过程,其实就是 javac 编译器解析 Java 源代码,并生成字节码文件的过程。说白了,其实就是使用 javac 编译器把 Java 语言规范转化为字节码语言规范。javac 编译器的处理过程可以分为下面四个阶段: 第一个阶段:词法、语法分析。在这个阶段,JVM 会对源代码的字符进行一次扫描,最终生成一个抽象的语法树。简单地说,在这个阶段 JVM 会搞懂我们的代码到底想要干嘛。就像我们分析一个句子一样,我们会对句子划分主谓宾

Java虚拟机:本地方法栈与Native方法

余生长醉 提交于 2019-12-01 19:50:10
转载自https://blog.csdn.net/qiaoguaping9272/article/details/81805920 刚开始看《深入理解Java虚拟机》,在里面看到一句话,不是很理解:本地方法栈与虚拟机栈所发挥的作用时非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的的Native方法服务。在这里转载一篇帖子介绍什么是Native方法。 今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解。 什么是Native Method 简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。 "A native method is a Java method whose implementation is provided by non-java code." 在定义一个native method时,并不提供实现体(有些像定义一个java interface)

动态代理与动态编译

我是研究僧i 提交于 2019-12-01 19:36:21
动态编程   动态编程是相对于静态编程而言,平时我们大多讨论的都是静态编程,java便是一种静态编程语言,它 的类型检查是在编译期间完成的。而动态编程是绕过了编译期间,在运行时完成类型检查。java有如下方法实现动态编程:动态代理,动态编译 动态代理:   动态代理在我在设计模式中已经介绍过了,主要是通过 Proxy类的 newProxyInstance方法和接口 InvocationHandler来实现动态代理。 代理对象的的生产过程在这里简单说一下: 1、ProxyGenerator.generateProxyClass方法负责生成代理类的字节码,生成逻辑比较复杂,了解原理继续分析源码 sun.misc.ProxyGenerator; byte[] proxyClassFile = ProxyGenerator.generateProxyClass(proxyName, interfaces, accessFlags); 2、native方法Proxy.defineClass0负责字节码加载的实现,并返回对应的Class对象。 Class clazz = defineClass0(loader, proxyName, proxyClassFile, 0, proxyClassFile.length); 3、利用clazz.newInstance反射机制生成代理类的对象;   

JDK8在windows系统下安装

淺唱寂寞╮ 提交于 2019-12-01 19:35:56
一、下载 下载地址: https://www.oracle.com/technetwork/java/javase/downloads/index.html#JDK8 目前大部分公司内部使用的还是jdk8,大部分依赖java的工具或框架,对jdk8的支持度是最好的,所以选择jdk8 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 下载对应的版本 e 会让登录,如果没有账号,注册一个即可。 二、jdk在windows系统下安装 如果点击安装包没有反应,则点击右键--属性 假如想修改安装地址: 修改jre路径 配置环境变量 JAVA_HOME:C:\Program Files\Java\jdk1.8 echo %JAVA_HOME% CLASSPATH加上: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\bin Path最后加上: ;%JAVA_HOME%/bin javac:是编译命令,将java源文件编译成.class字节码文件。(jdk) java:是运行字节码文件;由java虚拟机对字节码进行解释和运行。(jre) 验证是否安装成功 java -version javac

Interview

爷,独闯天下 提交于 2019-12-01 17:01:44
Python和Java、PHP、C、C#、C++等其他语言的对比? # C语言:通过指针可直接靠近硬件的操作,但指针操作不做保护,带来很多不安全的因素。 # C++:C语言的继承,编译型语言。 # C#:微软发布的,和Java比较相似,如单一继承、接口等 # Java:简单、面向对象、分布式、解释型、健壮、安全与系统无关、可移植、高性能、多线程和动态语言。 # PHP语言:用于web开发领域 # Python:胶水语言、面向对象、简洁而优雅 简述解释型和编译型语言? # 编译型:要编译器,相当于谷歌翻译,执行快,跨平台差,开发效率慢,调试麻烦 # 解释型:要解释器,相当于同生传译,跨平台好,执行慢,开发效率快,方便调试 Python解释器种类及特点? # CPython:C语言开发,官方版本 # IPython:基于CPython之上,跟国产浏览器差不多,虽外观不同,但内核都是调用IE # PyPy:目标是执行速度,采用JIT(just in time)技术,对代码进行动态编译。 # Jython:运行在Java平台的Python解释器,将代码编译成Java字节码执行 位bit、字节B、KB、MB、GB的关系? 8bit=1B;1024B=1KB;1024KB=1MB;1024MB=1GB 请至少列举5个PEP8规范 1.使用空格(space)表示缩进而不是用tab(制表符) 2

Java Security 介绍

强颜欢笑 提交于 2019-12-01 16:39:01
1.介绍 Java平台设计的重点是安全性。在其核心,java语言本身是类型安全的并且提供了垃圾自动回收,这使其增加了应用程序代码的健壮性。安全的类加载以及验证机制确保了只有合法的代码才能够执行。 初期的java平台为不信任的代码创建了一个安全的独立运行的安全环境,例如从公网下载的java applets。随着平台的增长以及部署范围的扩张,Java安全体系结构也相应地演变为支持日益增长的服务集。时至今日,这个架构包含了一系列的API,工具以及常用安全算法、机制和协议的实现。这就给开发者开发应用提供了很多安全框架,为用户或者管理员提供了安全管理应用程序的工具集。 Java安全API的范围很广,Cryptographic and public key infrastructure (PKI)接口为开发安全应用提供了基础。执行安全认证以及访问控制的的接口确保应用能够组织未授权的方位来保护资源的安全。 API允许对算法以及其他的安全服务进行多个可操作的实现。由Provider实现服务,通过标准接口嵌入到java平台,这就使应用程序包含了安全服务而不必知道任何关于他们的实现。这就允许开发者专注于怎样在服务中集成安全机制而不用考虑如何实现复杂的安全机制。 Java平台提供了许多Providers来实现许多核心的安全服务。同样页可以允许安装额外的定制Provider

谈JVM,字节码

不想你离开。 提交于 2019-12-01 16:10:36
谈谈JVM,最近在研究破解jar,有这方面经验的麻烦指导一下思路.. 参考 参考1 指令整理 常用指令 123 反编译查看`类文件`所有信息javap -verbose [class] 局部变量类型 特殊字符表示 类型 描述 c char char类型 i int int类型 l long long类型 s short short类型 b byte byte类型 f float float类型 z boolean 布尔类型 a reference 引用 方法信息 12345 L1 LOCALVARIABLE this LMain; L0 L1 0 LOCALVARIABLE a I L0 L1 1 MAXSTACK = 0 MAXLOCALS = 2 局部变量参数 LOCALVARIABLE 局部表大小 MAXLOCALS 操作数栈大小 MAXSTACK 指令 运算指令 算术指令用于对两个 操作数栈 上的值进行某种特定运算,并把结果重新存入到 操作栈 顶。 加法指令:iadd,ladd,fadd,dadd 减法指令:isub,lsub,fsub,dsub 乘法指令:imul,lmul,fmul,dmul 除法指令:idiv,ldiv,fdiv,ddiv 求余指令:irem,lrem,frem,drem 取反指令:ineg,leng,fneg,dneg 位移指令:ishl,ishr

Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

风格不统一 提交于 2019-12-01 16:02:19
原地址:https://www.cnblogs.com/flyingeagle/articles/7102282.html Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM) 一.class文件简介及加载   Java编译器编译好Java文件之后,产生.class 文件在磁盘中。这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码。JVM虚拟机读取字节码文件,取出二进制数据,加载到内存中,解析.class 文件内的信息,生成对应的Class对象:   class字节码文件是根据JVM虚拟机规范中规定的字节码组织规则生成的、具体class文件是怎样组织类信息的,可以参考 此博文: 深入理解Java Class文件格式系列 或者是 Java虚拟机规范 。   下面通过一段代码演示手动加载 class文件字节码到系统内,转换成class对象,然后再实例化的过程:   a. 定义一个 Programmer类: package com.bijian.study; /** * 程序猿类 */ public class Programmer { public void code() { System.out.println("I'm a Programmer,Just Coding....."); } }   b. 自定义一个类加载器: package