字节码

复习题

匿名 (未验证) 提交于 2019-12-03 00:33:02
1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?   java的跨平台不是java源程序的跨平台 ,如果是这样,那么所以语言都是跨平台的, java源程序先经过javac编译器编译成二进制的.class字节码文件(java的跨平台指的就是.class字节码文件的跨平台,.class字节码文件是与平台无关的),.class文件再运行在jvm上,java解释器(jvm的一部分)会将其解释成对应平台的机器码执行,所以java所谓的跨平台就是在不同平台上安装了不同的jvm,而在不同平台上生成的.class文件都是一样的,而.class文件再由对应平台的jvm解释成对应平台的机器码执行。 最后解释下机器码和字节码的区别: 一,机器码,完全依附硬件而存在~并且不同硬件由于内嵌指令集不同,即使相同的0 1代码 意思也可能是不同的~换句话说,根本不存在跨平台性~比如~不同型号的CPU,你给他个指令10001101,他们可能会解析为不同的结果~ 二,我们知道JAVA是跨平台的,为什么呢?因为他有一个jvm,不论哪种硬件,只要你装有jvm,那么他就认识这个JAVA字节码~~~~至于底层的机器码,咱不用管,有jvm搞定,他会把字节码再翻译成所在机器认识的机器码~~~ 2.JDK和JRE的区别是什么? JRE: Java Runtime Environment JDK:Java

编译过程

匿名 (未验证) 提交于 2019-12-03 00:33:02
解释器运行程序的方法 1.直接运行高级编程语言 2.转换高级编程语言码到一些有效率的字节码(Bytecode),并运行这些字节码 Python解释语言特点 "拆解"代码: 首先当用户键入代码交给Python处理的时候会先进行此法分析,例如用户键入关键字或者当输入关键字有误时,都会被此法分析所触发,不正确的代码将不会被执行 下一步Python会进行语法分析,例如当"for i in test:"中,test后面的冒号如果写成其他符号,代码依旧不会被执行 在执行Python前,Python会生成.pyc文件,这个文件就是字节码 1 如果不小心修改了字节码,Python下次重新编译该程序时会和其上次生成的字节码文件进行比较,如果不匹配则将会被修改过的字节码文件进行覆盖,以确保每次编译后字节码的准确性。 字节码在Python虚拟机程序里对应的是PyCodeObject对象。.pyc文件是字节码在磁盘上的表现形式。简单来说就是在编译代码的过程中,首先会将代码中的函数、类等对象分类处理,然后生成字节码文件。有了字节码文件,CPU可以直接识别字节码文件进行处理,接着Python就可执行了。 ? 原文: https://www.cnblogs.com/lshnice/p/9216471.html

jdk动态代理实现原理

匿名 (未验证) 提交于 2019-12-03 00:27:02
JDK动态代理 JDK动态代理是代理模式的一种实现方式,其只能代理接口。 使用步骤 1、 新建一个接口 2、 为接口创建一个实现类 3、 创建代理类实现java.lang.reflect.InvocationHandler接口 4、 测试 简单案例 根据使用步骤: 首先新建一个接口Subject package com.lnjecit.proxy; /** * Subject * 抽象主题接口 * @author * @create 2018-03-29 14:16 * */ public interface Subject { void doSomething(); } /** * RealSubject * 真实主题类 * @author * @create 2018-03-29 14:21 * */ public class RealSubject implements Subject { @Override public void doSomething() { System.out.println( "RealSubject do something" ); } } package com.lnjecit.proxy.dynamic.jdk; import java.lang.reflect.InvocationHandler; import java.lang

Daily notes -- 2018.6.12

匿名 (未验证) 提交于 2019-12-03 00:26:01
1.重写(Override)与重载(Overload)的区别 重写是 子类对父类 的 允许访问的方法 的实现过程进行重新编写,返回值和形参都不能改变。即外壳不变,核心重写。 重写的好处在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。 重写的方法不能抛出新的检查异常或者比重写方法声明更加宽泛的异常。 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。 父类的成员方法只能被它的子类重写。 声明为final的方法不能被重写。 声明为static的方法不能被重写,但是能够被再次声明。 重载是在一个类里面,方法名字相同,而参数不同,返回类型可以相同也可以不同。 最常用的就是构造器的重载。 方法重载是一个类的多态性表现,而方法重写是 子类与父类 的一种多态性表现。 2.JDK、JRE、JVM的区别与联系 JDK:Java Development ToolKit(Java开发工具包)。JDK是整个JAVA的核心,包括了Java运行环境(Java Runtime Environment),一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括 rt.jar) JDK有三种版本: J2SE : standard edition

opcache php性能提升用法小结

橙三吉。 提交于 2019-12-03 00:15:05
简介 当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode)。Opcode cache的目地是避免重复编译,减少CPU和内存开销,OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销。 工作原理 PHP执行代码会经过如下4个步骤(zend) input(PHP代码)->词法分析 ->语法分析 ->opcode ->Zend engine- >output 增加opcache之后,会变成以下步骤: 安装 PHP 5.5+以后内建了opcache,编译安装的时候--enable-opcache 就可以了。 其它版本需要下载和编译 下载 https://pecl.php.net/package/ZendOpcache 7.0.4.tgz 官网 编译扩展 wget https://pecl.php.net/get/zendopcache-7.0.4.tgz tar xzf zendopcache-7.0.4.tgz cd zendopcache-7.0.4 /usr/local/bin/phpize ./configure --with-php-config=/usr/local/bin/php-config

注解

匿名 (未验证) 提交于 2019-12-03 00:04:02
注解 概念: 说明程序的,jdk1.5之后 jdk中预定义的一些注解 @SuppressWarnings:压制警告 @SuppressWarnings("all"),压制所有警告 自定义注解 格式: 本质:本质上是一个接口,该接口默认继承Annotation接口 通过反编译可以知道:public interface myAnno extends java.lang.annotation.Annotation {} 属性:接口中的抽象方法 要求: 1,属性的返回值类型有一下几种,其余不行 基本数据类型 String 枚举:赋值: = 枚举类名.value @注解名 以上类型的数组 = {value1,value2,...} ,2,在使用定义的属性时,给属性赋值 例如int age();使用时: @ano(age = 1); 如果在注解内定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值 例如int age()default 1;使用时: @ano(); 如果只有一个属性需要赋值,并且属性的名称是value则value可以省略,直接使用值 例如int value();使用时: @ano(12); 如果数组中只有一个值,{}可以省略 元注解 :用于描述注解的注解 TYPE :可以作用于类上,例: @Target(value =

通过字节码分析异常表的重要作用以及locals属性的含义

匿名 (未验证) 提交于 2019-12-02 23:57:01
有如下代码 public class Test { public void work () { try { InputStream is = new FileInputStream ( "test.txt" ); ServerSocket serverSocket = new ServerSocket ( 9999 ); serverSocket . accept (); } catch ( FileNotFoundException e ) { } catch ( IOException e ) { } catch ( Exception e ) { } finally { System . out . println ( "finally block" ); } } } javap -verbose -p Test 结果如下 D : \workspace - learn\common - learn\learn - classloader\target\classes\com\learn\jvm > javap - verbose - p Test 警告: 二进制文件 Test 包含 com . learn . jvm . Test Classfile / D : /workspace-learn/ common - learn / learn - classloader /

reflect

匿名 (未验证) 提交于 2019-12-02 23:56:01
Reflect 在java中“万事万物皆是对象”,也就是万事万物都是各种各样的类,而对于类而言又可以进一步的抽象成为一类,来描述各种类,其一个实例对象就是一种类。反射(reflect)就是把一个类的各个成员映射成相对应的类型,我们通过方法可以得到一种类的字节码文件,在通过字节码文件来实现对这一种类进行操作比如实例化、修改属性,调用方法等。 获取字节码的三种方式:可以通过类,或者是一个类的一个具体实例对象,也可以通过那个类(描述类的那个类)方式如下: Class c = Class. forName ( "com.zrm.Student" ); // 通过类类 Class c1 = Student. class ; // 通过类名 Class c2 = student.getClass(); // 类的实例对象 package com.zrm;import java.lang.reflect.Constructor;import java.rmi.StubNotFoundException;public class ReFlect1 { public static void main(String[] args) throws Exception { Student student = new Student(); //获取反射的三种方式 Class c = Class

七月第二周

匿名 (未验证) 提交于 2019-12-02 23:48:02
这周主要的学习内容是了解到了Java语言的渊源、Java虚拟机和跨平台原理、Java开发环境的搭建和配置、使用记事本和MyEclipse开发Java程序、常用的Java反编译工具等知识。 Java语言小巧、安全、可移植,还能解决跨Internet的问题,是一种流行的编程语言。使用记事本编写Java程序时,在命令行窗口执行后输出个人信息;在开发大型项目时,为实现对项目的管理和维护,会选择使用可以提供图形化界面的集成开发环境MyEclipse。另外,在对某个Java程序进行学习、研究时,可以通过反编译工具将字节码文件转化为对应的.java源文件。将源文件(.java)转化为字节码文件(.class)的过程称为编译,将字节码文件(.class)转化回源文件(.java)的过程称为反编译。常用的反编译工具有jd、FrontEnd Plus 等。 下周学习计划:数据类型与运算符。 转载请标明出处: 七月第二周 文章来源: 七月第二周

JVM虚拟机

匿名 (未验证) 提交于 2019-12-02 23:45:01
一、JVM虚拟机的原理 所谓虚拟机,就是一台虚拟的机器,他是一款软件,用来执行一系列虚拟计算指令,大体上虚拟机可分为系统虚拟机和程序虚拟机,他们完全是对物理的计算的仿真,提供一个可以运行完整操作系统的软件平台。 程序虚拟机典型代码就是Java虚拟机,他专门为执行单个计算程序而计算,在Java虚拟机中执行的指令我们称为Java字节码指令,无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。 JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种基于下层的操作系统和硬件平台并利用软件方法来实现的抽象的计算机,可以在上面执行java的字节码程序。 java编译器只需面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译器,编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行 二、JVM生命周期: 1.启动:启动一个Java程序,拥有一个public static void main(String[]args)的class都可以作为JVM实例运行的起点。 2.运行:main()作为程序的七点,任何线程都可以由main线程启动 3.结束:程序中所有线程都终止,JVM才退出。 三、JVM的基本结构 1.类装载器:ClassLoader――用来装载.class文件