字节码

Java程序运行机制与开发环境

匿名 (未验证) 提交于 2019-12-02 21:53:32
Java既是编译型语言,又是解释型语言 java源文件首先需要通过javac编译生成后缀名为.class的字节码文件(与平台无关,只面向JVM),然后使用Java虚拟机将字节码解释成特定平台上的机器码运行。 Java虚拟机JVM 不同平台上的JVM不同,但是都提供了相同的接口。 开发Java准备 下载安装Java8的JDK,并将jdk的安装路径添加到环境变量中。 开发Java需要安装JDK,JDK包含Java编译器(javac命令工具)、Java运行时环境(JRE)、常用的Java类库等。 JRE包含JVM,还包含类加载器、字节码校验器及大量的基础类库等环境支持。 如果只是运行Java程序,可以只安装JRE。 第一个Java程序 编写第一个著名的程序:HelloWorld。 pulic calss HelloWorld { public static void main(String[] args) { System.out.println("HelloWorld"); } } 使用javac命令编译java程序。 命令行输入cmd,进入Java源文件所在的路径 输入如下命令,其中destdir是目标生成路径 javac -d destdir HelloWorld.java 进入destdir路径下,可以看到已经生成了后缀名为.class的字节码文件

你真的了解java序列化吗

匿名 (未验证) 提交于 2019-12-02 21:53:32
问: 可是我这个实体类,没有实现序列化那个接口,也能存到数据库,这是为什么呢? 想不通!我是用的注解和hibernate框架弄的! 难道说不实现序列化接口也能保存数据?不应该啊。 @Entity public class Person { @Id @GeneratedValue private Integer id; private String name; private Integer age; } 答: 你用habernate保存数据,只要XML文件配置好了,实体类DAO层都没错,调用SAVE方法 然后COMMIT就可以保存数据。 序列化主要就是把你要保存的数据,转换成字节码的形式,反序列化就是把字节码变成数据。 你直接把数据通过本机服务器提交给硬盘,确实不需要序列化。 但是你在网络传输的时候就不行了,你传给别人一个东西,它接收了所有的字节码之后,却不知道你原本传的是什么对象,也就没法把这个东西按照原始去解析。 你序列化之后,在传给对方,他接收到的时候会按照序列化特定的模式,给反序列化出来,也就是说你传了什么,对方接收的也是什么,解析成功,可以正确使用方法以及属性。 追问: 你没明白我的意思,我不是问什么叫序列化 我问你我没实现序列化接口Serializable 为什么还可以保存对象到数据库呢? 追答: 本来就是可以保存的啊。你想想最开始学习数据库和JAVA的时候

Java 调式、热部署、JVM 背后的支持者 Java Agent

匿名 (未验证) 提交于 2019-12-02 21:52:03
Java 调式、热部署、JVM 背后的支持者 Java Agent 我们平时1765243235写 Java Agent 的机会确实不多,也可以说几乎用不着。但其实我们一直在用它,而且接触的机会非常多。下面这些技术都使用了 Java Agent 技术,看一下你就知道为什么了。 - 各个 Java IDE 的调试功能,例如 eclipse、IntelliJ ; - 热部署功能,例如 JRebel、XRebel、 spring-loaded; - 各种线上诊断工具,例如 Btrace、Greys,还有阿里的 Arthas; - 各种性能分析工具,例如 Visual VM、JConsole 等; Java Agent 直译过来叫做 Java 代理,还有另一种称呼叫做 Java 探针。首先说 Java Agent 是一个 jar 包,只不过这个 jar 包不能独立运行,它需要依附到我们的目标 JVM 进程中。我们来理解一下这两种叫法。 代理 :比方说我们需要了解目标 JVM 的一些运行指标,我们可以通过 Java Agent 来实现,这样看来它就是一个代理的效果,我们最后拿到的指标是目标 JVM ,但是我们是通过 Java Agent 来获取的,对于目标 JVM 来说,它就像是一个代理; 探针 :这个说法我感觉非常形象,JVM 一旦跑起来,对于外界来说,它就是一个黑盒。而 Java

Java代码执行过程概述

匿名 (未验证) 提交于 2019-12-02 21:52:03
Java代码经历三个阶段:源代码阶段(Source) -> 类加载阶段(ClassLoader) -> 运行时阶段(Runtime)         首先我们来理清一下Java代码整个执行过程, 让我们对其有个整体的认识: Java源程序 (.java)经过 Java编译器 (javac)以后, 生成一个或多个 字节码 (.class)文件, JVM 将每一条要执行的 字节码 通过 类加载器ClassLoader 加载进内存, 再通过 字节码校验器 的校验 , J ava解释器 翻译成对应的 机器码 当程序要使用某个 类 时, 如果该 类 还未被加载到内存中, 则系统会通过 加载, 连接, 初始化 三步来实现对这个 类 进行初始化: 加载 就是将class文件读入内存, 并为之创建一个Class对象(任何 类 被使用时系统都会创建且只创建一个Class对象)    JVM 进行 类加载 类 堆 中生成一个代表这个类的java.lang.Class对象, 作为 方法区 这些数据的访问入口   类的加载的最终产品是位于 堆 区中的Class对象, Class对象封装了类在方法区内的数据结构, 并且向Java程序员提供了访问方法区内的数据结构的接口    类 的 加载 时机   通俗的说就是只要用到了类的东西类就会加载    JVM 在运行时会产生3个类加载器组成的初始化加载器层次结构

java ASM

匿名 (未验证) 提交于 2019-12-02 21:52:03
一、什么是ASM   ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。 https://www.cnblogs.com/liuling/archive/2013/05/25/asm.html 来源:博客园 作者: zzfx 链接:https://www.cnblogs.com/feng9exe/p/11557489.html

JVM类加载机制

匿名 (未验证) 提交于 2019-12-02 21:52:03
描述JVM如何加载Class字节码文件。 加载 连接 验证 准备 解析 初始化 获取类的二进制字节流加载到内存(比如从Zip包,网络,反射中读取) 将字节码的静态数据结构转换成运行时数据结构 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口 保证字节流的信息符合JVM规范。 (JVM的自我保护机制) 正常运行Java程序可以通过.java编译成class文件,然后交由JVM执行。编译器虽然本身可以检测Java的安全问题。但是除了编译产生字节码文件之外,还可以通过其他途径产生,比如直接编写字节码文件或者通过第三方无编译检查的编译器生成。 JVM验证包括四个方面: 文件格式验证 版本号是否能被当前版本的虚拟机执行 检查字节流是否有被删除或者附加的信息 .... 元数据验证 检测当前类是否有父类,是否继承了final修饰的类,是否重写了final修饰的方法 字节码验证 主要对方法体进行验证,避免由于方法运行时造成虚拟机崩溃。 符合引用验证 发生在符合引用转换为直接引用的时候。 符号引用于直接引用的区别:符号引用可以理解为一个字符串,是静态的,也就是在程序未执行之前对类,方法等的表示。等程序执行的时候,会在内存中将符号引用转换为直接引用,真正的执行方法,完成类之间的调用。【举个栗子】我是特种兵系列一度热播,其中集训时候的编号就和直接引用很类似

浅谈Java反射机制 之 获取类的字节码文件

匿名 (未验证) 提交于 2019-12-02 21:52:03
先贴上Java反射机制的概念: AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法和属性; 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 这么一讲很强大有没有! 反射的机制的实现还有仰仗Class类,因为想要剖析一个类就必须先要获取到该类的字节码文件对象,而Class类用于表示.class文件(字节码) 而且从获取到剖析使用的都是Class类的方法。 获取类字节码方法有三种: getClass()方法其实是Object的一个方法,Class继承了Object,所以我们可以直接使用。 public class Test01 { public static void main(String[] args) { Student stu=new Student(); Class c=stu.getClass(); System.out.println(c.getName()); } } 结果:com.reflection.model.Student 当然这种方法没什么意义,因为我们都 new 实例化对象了,就没有必要反射了。 2、通过类的 .class 属性获取类的字节码文件 import com.reflection.model.Student; public class

JAVA元注解

匿名 (未验证) 提交于 2019-12-02 21:45:52
java中元注解有四个: @Retention @Target @Document @Inherited; @Retention:注解的保留位置 @Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含 @Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得 @Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到 @Target:注解的作用目标          @Target(ElementType.TYPE) //接口、类、枚举、注解 @Target(ElementType.FIELD) //字段、枚举的常量 @Target(ElementType.METHOD) //方法 @Target(ElementType.PARAMETER) //方法参数 @Target(ElementType.CONSTRUCTOR) //构造函数 @Target(ElementType.LOCAL_VARIABLE)//局部变量 @Target(ElementType.ANNOTATION_TYPE)//注解 @Target(ElementType

Java复习一

匿名 (未验证) 提交于 2019-12-02 21:40:30
Java简介: Java是一门跨平台的语言,真正真实现了“一次编写到处运行”。Java语言编写的程序既是编译型语言又是解释性语言,。程序代码经过编译之后转换为一种称为Java字节码的中间语言,Java虚拟机JVM将对字节进行解释和运行。编译只进行一次,而解释在每次运行程序是都会运行。编译后的字节码采用一种针对JVM优化过的机器码形式进行保存,虚拟机将字节码转换为机器码,然后在计算机上运行。如图一 ͼһ JavaAPI: JDK文档,即应用程序编程接口,是JAVA开发不可缺少的编程词典 Java特性: 简单,面向对象,可移植,动态,多线程,分布式,解释型,健壮性,安全性,高性能。 第一个Java程序: public class HelloWord{ public static void main(String []args){ System.out.println("HelloWord"); } } 5. Java的主类结构 Java程序的基本组成单位就是类,类包括属性和方法两大部分。类与对象相当于数据类型和标量的关系。每个Java本地应用程序都包含一个main()方法,main()方法为Java程序的入口,包含main()方法的类成为主类。一个完整的主类结构通常由定义包语句、定义类语句、定义主方法语句、定义变量语句和导入API类库5部分组成。 定义包:Java包就是文件夹

第一个Java程序示例――Hello World!

匿名 (未验证) 提交于 2019-12-02 21:40:25
跟随世界潮流,第一个Java程序输出“Hell World!”。 通过Eclipse运行程序 启动Eclipse,在菜单中选择“文件 --> 新建 --> Java项目”,弹出对话框: 在菜单中选择“文件 --> 新建 --> 类”,弹出对话框: 输入类名称,点击“完成”,成功创建一个HelloWorld类: 将下面的代码输入到源文件,注意Java是大小写敏感的: public class HelloWorld { public static void main (String [] args ) { System .out . println ( "Hello World!" ); } } ,或者在菜单中选择“运行 --> 运行”,就可以看到下方控制台输出了“Hello World!”: 恭喜你,你成功编写并运行了第一个Java程序。 打开Demo文件夹下的bin目录,出现了一个 HelloWorld.class 文件,这就是编译生成的字节码。与C、C++不同,Java编译的结果不是可执行文件,而是字节码文件。字节码文件不能直接运行,必须由JVM翻译成机器码才能运行,这就是为什么运行Java程序必须安装JVM的原因。 通过命令行运行程序 当然,你也可以直接输入命令来编译和运行Java。 打开CMD,cd 到源文件所在目录,通过 javac filename 命令完成编译,通过