字节码

java反射机制详解

匆匆过客 提交于 2019-12-02 10:51:38
一、什么是反射 JAVA反射机制是在运行状态中,对于任何一个类,都能够知道这个类的所有属性和方法;对于任何一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属性,类名,父类名,实现的所有接口等等),每一个类对应着一个字节码文件也就对应着一个Class类型的对象,也就是字节码文件对象。 获取字节码文件对象(获取class对象的方式)的三种方式: 1、根据类名:类名.class 2、根据对象:对象.getClass() 3、根据全限定类名:Class.forName(全限定类名) 二、通过反射机制获取信息 1、构造函数 //获取字节码文件 Class classs = Class.forName("com.zcbq.reflect.User"); //先获取有参构造,parameterTypes:表述参数列表,也可以不写 Constructor constructor = classs.getConstructor(int.class,String.class,int.class,String.class); //通过构造器来实例化对象,将实际的参数传进去 User user =

java基础003

眉间皱痕 提交于 2019-12-02 10:45:28
1.Mysql两种储存引擎:innoDB和MylSAME MyISAM强调表的性能,执行速度比innoDB快,但不支持事物等高级数据库功能(表级锁(容易造成锁冲突,并发最低))。 innoDB支持事物,外键,行级锁(并发最高)等高级数据库功能。 2.简述synchronized和java.util.concurrent.locks.Lock的异同? 主要相同点 :Lock能完成synchronized所实现的所有功能; 主要不同点: Syschronized是在jvm层面上的,是一个关键字,而Lock是一个类; Lock有比synchronized更精确的线程语义和更好的性能,而且不强制性的要求一定要获得锁; Syschronized同步数据少量的话,性能比Lock好,而数据大量同步,Lock性能要好 synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且最好在finally块中释放(这是释放外部资源的最好的地方)。 3.说出一些常用的类,包,接口,请各举5个? 类:String Integer File Date HashMap 包:java.lang java.util java.sql java.io javax.servlet 接口:Map List Set Servlet Runnable 4.java中实现多态的机制是什么?

java高级-高性能-多线程并发编程--1.1.1 java程序运行原理

蹲街弑〆低调 提交于 2019-12-02 09:18:01
了解内容 class文件 class文件包含了java程序执行的 字节码 ; 数据按照格式紧凑的排列在class文件中的二进制流 ,中间无任何分割符; 文件 开头 有一个 16进制特色的标志(0x ca fe ba be) 复杂的文件格式并不是给程序员看的 ,而是专门给JVM 看,人可以借助工具查看. 经过不同的JVM解析 , 转换为具体平台上的机器指令 实现跨平台 class内容 线程角度看内存图的介绍 方法区 JVM用来存储加载的类信息, 常量,静态变量,编译后的代码等数据. 每一个Java应用都唯一对应一个JVM实例, 每一个实例唯一对应一个堆 。应用程序在运行中所创建的 所有类实例或数组 都放在这个堆中,并由应用所有的线程共享. 堆内存 可以细分为: 老年代 ,新生代 JVM启动时创建,存放对象的实例. 这里涉及 垃圾回收器 虚拟机栈 用于执行java方法 设立的 每个线程都在这个空间有一个私有的空间. 线程栈=栈帧+栈帧+栈帧+栈帧+栈帧+… 一个线程会执行一个/多个方法 ,一个方法对应一个栈帧 栈帧包含:局部变量,操作数栈 ,动态链接 ,方法返回地址,附加信息等 栈内存默认最大是1M,超出 抛出异常 StackOverflowError 堆 溢出 错误 本地方法栈 和虚拟栈类似 . HotSpot虚拟机中 虚拟机栈和本地方法栈 是一样的 用于为虚拟机使用Native

v8引擎详解(摘)

偶尔善良 提交于 2019-12-02 08:52:41
随着Web相关技术的发展,JavaScript所要承担的工作也越来越多,早就超越了“表单验证”的范畴,这就更需要快速的解析和执行JavaScript脚本。V8引擎就是为解决这一问题而生,在node中也是采用该引擎来解析JavaScript。 WebKit是由苹果2005年发起的一个开源项目,引起了众多公司的重视,几年间被很多公司所采用,在移动端更占据了垄断地位。更有甚者,开发出了基于WebKit的支持HTML5的web操作系统(如:Chrome OS、Web OS)。 2.V8引擎   V8引擎是一个JavaScript引擎实现,最初由一些语言方面专家设计,后被谷歌收购,随后谷歌对其进行了开源。V8使用C++开发,,在运行JavaScript之前,相比其它的JavaScript的引擎转换成字节码或解释执行,V8将其编译成原生机器码(IA-32, x86-64, ARM, or MIPS CPUs),并且使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序在V8引擎下的运行速度媲美二进制程序。V8支持众多操作系统,如windows、linux、android等,也支持其他硬件架构,如IA32,X64,ARM等,具有很好的可移植和跨平台特性。 3.V8 VS JavaScriptCore  

改变键盘事件

僤鯓⒐⒋嵵緔 提交于 2019-12-02 06:40:33
用js改变键盘事件做一个简单的改建效果上下左右控制方格效果 用js代码来改变按钮事件,先获取键盘事件,然后转换为字节码,字节码值对应相应的键盘事件,来改变对应默认的值 1、以下是演示效果 2、以下是代码演示,思路,吧获取到的键盘事件转换为event.keyCode值,再用event.keyCode值给相对应更改的键盘值 3、以下是html代码块 < img src = "img/eclipse_update_120.jpg" id = "imgShow" style = " width: 70px; height: 70px; position:absolute; top: 120px; left: 0px;" / > 上: < input type = "text" id = "top" onkeydown = "top1()" / > < br / > 下: < input type = "text" id = "bottom" onkeydown = "bottom1()" / > < br / > 左: < input type = "text" id = "left" onkeydown = "left1()" / > < br / > 右: < input type = "text" id = "right" onkeydown = "right1()" / > <

Java运行原理

☆樱花仙子☆ 提交于 2019-12-02 06:23:26
JAVA运行原理 Java程序的工作原理 Java程序的工作原理 Java拥有一个虚拟计算机系统——JVM。 JVM是Java的虚拟机,是一个可以执行Java字节码的虚拟机进程。 用Java编写的程序(存放在扩展名为java的文件中)经过编译器(即JDK根目录bin文件夹中的javac.exe文件)编译成字节码文件(即扩展名为class的文件)。 这个字节码文件不是针对具体平台的,而是针对抽象的Java虚拟机的,在Java虚拟机上运行,在不同类型的平台上安装不同的Java虚拟机,这些不同的Java虚拟机屏蔽了各个不同平台的差异,从而使编译过的Java程序具有平台无关性,即Java虚拟机在执行字节码时,把字节码解析成具体平台上的机器指令执行。 显而易见,java的程序的优点即JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的字节码,就可以在多种平台上不加修改地运行。这个也是java最大的特色跨平台性,也就是一处编写,处处运行。 如图所示:.java的源程序通过Java编译器生成了.class的字节码文件,该字节码在类装载器上运行,再经过字节码校验器检验最终通过解释器将字节码解释为复合当前操作系统的机器码。 总之,Java语言是一种先编译后解释型语言! 来源: https://blog.csdn.net/weixin_45783574

枚举相关-这一篇全了解

青春壹個敷衍的年華 提交于 2019-12-02 05:22:37
什么是枚举? 解: 链接: Java的枚举类型用法介绍-HollisChuang's Blog 枚举是如何实现的? 解: 参考 链接: 深度分析Java的枚举类型—-枚举的线程安全性及序列化问题-HollisChuang's Blog Java 枚举类比较用 == 还是 equals,有哪些区别? 解: java 枚举值比较用 == 和 equals 方法没啥区别,两个随便用都是一样的效果。因为枚举 Enum 类的 equals 方法默认实现就是通过 == 来比较的;类似的 Enum 的 compareTo 方法比较的是 Enum 的 ordinal 顺序大小;类似的还有 Enum 的 name 方法和 toString 方法一样都返回的是 Enum 的 name 值。 Java 枚举类可以继承其他类(或实现其他接口)或者被其他类继承吗,为什么? 解: 枚举类可以实现其他接口但不能继承其他类,因为所有枚举类在编译后的字节码中都继承自 java.lang.Enum,而 Java 不支持多继承,所以枚举类不可以继承其他类。 枚举类不可以被继承,因为所有枚举类在编译后的字节码中都是继承自 java.lang.Enum)的 final class 类,final 的类是不允许被派生继承的。 Java中的switch是如何对枚举进行支持的? 解: Java 1.7 之前 switch

深入理解Python中的GIL(全局解释器锁)

自作多情 提交于 2019-12-02 05:13:13
深入理解Python中的GIL(全局解释器锁) Python是门古老的语言,要想了解这门语言的多线程和多进程以及协程,以及明白什么时候应该用多线程,什么时候应该使用多进程或协程,我们不得不谈到的一个东西是Python中的GIL(全局解释器锁)。这篇我们就来看看这个GIL究竟是怎么回事。 1. GIL是什么? 首先来看看GIL究竟是什么。我们需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把GIL归结为Python语言的缺陷。所以这里要先明确一点:GIL并不是Python的特性,Python完全可以不依赖于GIL。 那么CPython实现中的GIL又是什么呢?GIL全称Global Interpreter Lock为了避免误导,我们还是来看一下官方给出的解释: In CPython, the global

关于python代码是编译执行还是解释执行

二次信任 提交于 2019-12-02 02:39:53
什么是 编译型语言 ,什么是 解释型语言? 编译执行: 源代码经过编译器编译处理,生成目标机器码,就是机器能直接运行的二进制代码,下次运行时无需重新编译。 比如:C、C++这类语言属于编译型语言。 缺点:它不具备可移植性 优点:但是执行速度快 解释型语言: 在代码运行期间逐行翻译成目标机器码,下次执行时,还是需要逐行解释,我们可以简单认为 Java、Python 都是 解释型语言 。 缺点:效率没有编译型高 优点:移植性强 以上是 对编译型语言 和 解释型语言 的一个简单粗暴的区分,但是 Python(这里主要是指 CPython )并不是严格的解释型语言; 因为 Python 代码在运行前,会先编译(翻译)成中间代码,每个 .py 文件将被换转成 .pyc 文件,.pyc 就是一种字节码文件,它是与平台无关的中间代码,不管你放在 Windows 还是 Linux 平台都可以执行,运行时将由虚拟机逐行把字节码翻译成目标代码。 总结:pyhon→cpython cpython是可以直接运行的无关平台 我们安装Python 时候,会有一个 Python.exe 文件, 它就是 Python 解释器,你写的每一行 Python 代码都是由它负责执行 , 解释器由一个编译器和一个虚拟机构成 ,编译器负责将源代码转换成字节码文件,而虚拟机负责执行字节码,所以,解释型语言其实也有编译过程

JVM

大憨熊 提交于 2019-12-02 02:39:00
JVM(Java Virtual Machine,Java虚拟机)是一个虚构出来的计算机,通过在真实的计算机上模拟各种计算机功能。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得 Java编译器生成的字节码文件,可以在多种平台上不加修改地运行。 Java代码编译运行过程:Java源码文件(.java)-> Java编译器 -> 字节码文件(.class)-> JVM -> OS 运行。 1. JVM体系结构 类装载器子系统:用来装载 .class 字节码文件。 运行时数据区:方法区、Java堆、Java栈、本地方法栈和程序计数器。 执行引擎:执行字节码或本地方法。 本地方法接口: 垃圾回收器: 方法区被所有线程共享,用于存放被JVM加载的类信息,常量,静态变量等数据。 Java堆被所有线程共享,用于存放对象实例。堆是GC的主要区域,通常分为新生代和老年代。新生代又分为Eden区和两个Survivor区。Eden区主要放新创建对象,From survivor 和 To survivor 保存GC后幸存下的对象,默认情况下占比 8:1:1。会发生OutOfMemoneyError异常。 Java栈是线程私有的,生命周期与线程相同。每个方法执行都会创建一个栈帧,用于存放局部变量表,操作栈,动态链接,方法出口等。每个方法从被调用,直到被执行完