作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在上一篇 Helloworld 中,我们初步尝试使用了 Javassist字节编程的方式,来创建我们的方法体并通过反射调用运行了结果.大致了解到创建在使用字节码编程的时候基本离不开三个核心类:ClassPool.CtClass.CtMethod,它们分别管理着对象容器.类和方法.但是我们还少用一样就是字段:CtFields,在这一章节中我们不止会使用字段,还会创建多个不同入参类型和…
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 通过前面两篇 javassist 的基本内容,大体介绍了:类池(ClassPool).类(CtClass).属性(CtField).方法(CtMethod),的使用方式,并通过创建不同类型的入参出参方法,基本可以掌握如何使用这样的代码结构进行字节码编程. 那么,今天我们尝试使用 javassist 去修改一个正在执行中的类里面的方法内容.也就是在运行时重新加载类信息 可能在你平时的…
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 目录 @ 目录 目录 一.前言 二.开发环境 三.案例目标 四.技术实现 五.测试结果 1. 使用Javassist生成的类 2. 输出的测试结果 六.总结 一.前言 在字节码编程方面有三个比较常见的框架:ASM.byte-buddy.Javassist,他们都可以对这字节码进行操作,只是操作方式和控制粒度不同. 其中 ASM 更偏向于底层,需要了解 JVM 虚拟机中指定规范以及对局部变量以…
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 相对于小傅哥之前编写的字节码编程: ASM.Javassist 系列,Byte Buddy 玩法上更加高级,你可以完全不需要了解一个类和方法块是如何通过 指令码 LDC.LOAD.STORE.IRETURN... 生成出来的.就像它的官网介绍: Byte Buddy 是一个代码生成和操作库,用于在 Java 应用程序运行时创建和修改 Java 类,而无需编译器的帮助.除了 Java…
字节码操作Javassist 字节码:字节码是设计被用来将代码高效的传送给多种软件平台.硬件平台,字节码的设计也实现了Java的平台无关性,字节码比机器码更抽象,它通常被认为是包含了一个可执行文件的二进制文件. Javassist是一个类库用于在java中编辑字节码.它允许在程序运行时定义一个新类在JVM加载时修改类文件 面向切面编程(AOP):Javassist可以动态在一个类中增加一个新的方法,或者是在调用者或者被调用者的前(before).后(after).周围(around)加代码. R…
一.线程的交互 a.线程交互的基础知识 线程交互知识点需要从java.lang.Object的类的三个方法来学习:    void notify()           唤醒在此对象监视器上等待的单个线程(notify()方法调用的时候,锁并没有被释放).  void notifyAll()           唤醒在此对象监视器上等待的所有线程.  void wait()           导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法(…
一.概念 [基本] /** * */ package cn.sxt.jvm; import javassist.ClassPool; import javassist.CtClass; import javassist.CtConstructor; import javassist.CtField; import javassist.CtMethod; public class Test_0420_Javassist { public static void main(String[] args…
字节码技术可以动态改变某个类的结构(添加/删除/修改  新的属性/方法) 关于字节码的框架有javassist,asm,bcel等 引入依赖 <dependency> <groupId>javassist</groupId> <artifactId>javassist</artifactId> <version>.GA</version> </dependency> 生成字节码 //创建字节码文件 public…
使用BCEL动态改变Class内容 之前对Class文件中的常量池,Method的字节码指令进行了说明.JVM Class详解之一JVM Class详解之二 Method字节码指令现在我们开始实际动手,使用BCEL改变字节码指令,对Class文件进行功能扩充. 先介绍下BCEL全程Apache Byte Code Engineering Library,BCEL 每项内容操作在JVM汇编语言的级别 HelloWorld搞起 这个case我们需要给Programmer类做功能扩展,Programm…
JDK源码学习String篇中,有一处错误,String类用final[不能被改变的]修饰,而我却写成静态的,感谢CTO-淼淼的指正. 风一样的码农提出的String为何采用final的设计,阅读JDK源码的时候,有粗略的思考过,今天下班后又把<Thinking in Java>中关于final的内容重新看了一遍,对此写下一些关于自己的理解和想法. String类中final关键字的使用 final关键字,用来描述一块数据不能被改变,两种可能理由:设计.效率 final使用的三种情况:数据.方…
分类: sql编程:标准的sql 编程 * 纯sql 在标准的编程中又分为 sqlserver-->T-sql oracle-->pl-sql(扩展) 变量:在使用变量之前先定义 声明变量 sql 格式: declare 变量名 数据类型变量的分类:局部变量 全部变量局部变量:由程序员定义在一个程序内部使用的所有的局部变量名都必须以@符最为前缀//例子declare @num nvarchar(5) 一个 declare 可以定义多个变量 用,隔开2.为变量赋值=变量值a.set 变量名这次赋…
1.解释器:将源码转换为动作(机器语言),并立即执行 编译器:编译器也会将源码转换为机器语言,但是中间会经过好多步骤,分段编译 ,然后链接,可以实现将代码模块化 2.c++不鼓励多使用预处理命令 3.c++使用静态类型检查,当然也可以加代码进行动态类型检查 4.带空参数 int func(); c++认为就是"不带参数的函数",c认为是可带任意参数(任意数目,任意类型的)函数 5.extern int a:强调只申明不定义.--即不会分配内存 6.#include <header…
REFERENCE:<Head First Python> ID:我的第二篇[Python学习] BIRTHDAY:2019.7.13 EXPERIENCE_SHARING:解决切换当前工作目录时出现的错误——FileNotFoundError 1.错误类型 FileNotFoundError: [WinError 3] 系统找不到指定的路径.: '../HeadFirstPython/chapter3' 在文件夹D:\0tempt,新建了文件夹 HeadFirstPython,其包含子文件夹…
Java虚拟机的执行引擎不管是解释执行还是编译执行,根据概念模型都具有统一的外观:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果. 运行时栈帧结构 栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法的局部变量表.操作数栈.动态连接和方法返回地址以及一些额外的附加信息.每一个方法从调用开始到执行完成的过程,就对应着一个栈帧在虚拟机里面从入栈到出…
目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.ClassLoader源码分析 11.自定义类加载器 12.加载类的三种方式 13.总结 14.特别注意 @ 前言 你是否真的理解java的类加载机制?点进文章的盆友不如先来做一道非常常见的面试题,如果你能做出来,可能你早已掌握并理解了java的类加载机制,若结果出乎你的意料,那就很有必要来了解了解j…
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.csdn.net/qq_35925558/NOTE_JVM https://github.com/uxiahnan/NOTE_JVM 目录 1. 概述 1.1. 大厂面试题 1.2. 类加载器的分类 1.3. 类加载器的必要性 1.4. 命名空间 1.5. 类加载机制的基本特征 1.6. 类加载器之间的…
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.csdn.net/qq_35925558/NOTE_JVM https://github.com/uxiahnan/NOTE_JVM 目录 1. 概述 大厂面试题 2. 过程一:Loading(加载)阶段 2.1. 加载完成的操作 2.2. 二进制流的获取方式 2.3. 类模型与Class实例的位置 2…
JVM 字节码(二)方法表和属性表 上一节中对 ClassFile 的整体进行了五个详细的说明, 本节围绕 ClassFile 最重要的一个内容 - 方法表的 Code 属性展开 ,更多 JVM Methods 规范(Oracle) 一.方法表结构 1.1 方法表结构 方法表的结构如下: method_info { u2 access_flags; u2 name_index; u2 descriptor_index; u2 attributes_count; attribute_info at…
一.javassist javassist让我们操作字节码更加简单,它是一个类库,允许我们修改字节码.它允许java程序动态的创建.修改类. javassist提供了两个层次的API,基于源码级别的和字节码级别的. 二.javassist创建类 1.获取类池 2.在类池中添加要创建的类 3.添加变量,方法,构造器 4.将创建好的类写出 import java.io.IOException; import java.lang.String; import javassist.CannotCompi…
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.csdn.net/qq_35925558/NOTE_JVM https://github.com/uxiahnan/NOTE_JVM 目录 Class文件结构 1. Class字节码文件结构 2. Class文件数据类型 3. 魔数 4. 文件版本号 4.1. Class文件版本号对应关系 5. 常量池…
在前面介绍invokevirtual指令时,如果判断出ConstantPoolCacheEntry中的_indices字段的_f2属性的值为空,则认为调用的目标方法没有连接,也就是没有向ConstantPoolCacheEntry中保存调用方法的相关信息,需要调用InterpreterRuntime::resolve_invoke()函数进行方法连接,这个函数的实现比较多,我们分几部分查看: InterpreterRuntime::resolve_invoke()函数第1部分: Handle r…
与invokevirtual指令类似,当没有对目标方法进行解析时,需要调用LinkResolver::resolve_invoke()函数进行解析,这个函数会调用其它一些函数完成方法的解析,如下图所示. 上图中粉色的部分与解析invokevirtual字节码指令有所区别,resolve_pool()函数及其调用的相关函数在介绍invokevirtual字节码指令时详细介绍过,这里不再介绍. 调用LinkResolver::resolve_invokeinterface()函数对字节码指令进行解析…
Javassist优势 – 比反射开销小,性能高.–javassist性能高于反射,低于ASM运行时操作字节码可以让我们实现如下功能:– 动态生成 新的类– 动态改变某个类的结构 ( 添加 / 删除 / 修改 新的属性 / 方法 )javassist 的最外层的 API 和 JAVA 的反射包中的 API 颇为 类似 .它 主要 由 CtClass , CtMethod, ,以及 CtField 几个类组成.用以执行和 JDK 反射 API 中 java.lang.Class, java.lan…
方法返回的字节码相关指令如下表所示. 0xac ireturn 从当前方法返回int 0xad lreturn 从当前方法返回long 0xae freturn 从当前方法返回float 0xaf dreturn 从当前方法返回double 0xb0 areturn 从当前方法返回对象引用 0xb1 return 从当前方法返回void 模板定义如下: def(Bytecodes::_ireturn , ____|disp|clvm|____, itos, itos, _return , ito…
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 片面了! 一月三舟,托尔斯泰说:"多么伟大的作家,也不过就是在书写自己的片面而已".何况是我,何况是我们! 虽然我们不书写文章,但我们写需求.写代码.写注释,当我们遇到了需要被讨论的问题点时,往往变成了争论点.这个好.那个差.你用的都是啥啥啥! 当你把路走窄了,你所能接受到的新的思路.新的想法.新的视野,以及非常重要的收入,也都会随之减少.只有横向对比.参考借鉴.查漏补缺…
概述 执行引擎是Java虚拟机最核心的组成部分之一.“虚拟机”是一个相对于“物理机”的概念 ,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器.硬件.指令集和操作系统层面上的,而虚拟机的执行引擎则是由自己实现的,因此可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式. 在Java虚拟机规范中制定了虚拟机字节码执行引擎的概念模型,这个概念模型成为各种虚拟机执行引擎的统一外观(Facade ).在不同的虚拟机实现里面,执行引擎在执行Java代码…
字节码技术应用场景 AOP技术.Lombok去除重复代码插件.动态修改class文件等 字节技术优势  Java字节码增强指的是在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修改.Java字节码增强主要是为了减少冗余代码,提高性能等. 实现字节码增强的主要步骤为: 1.修改字节码    在内存中获取到原来的字节码,然后通过一些工具(如 ASM,Javaasist)来修改它的byte[]数组,得到一个新的byte数组.    2.使修改后的字节码生效…
深入理解Java虚拟机(字节码执行引擎) 本文首发于微信公众号:BaronTalk 执行引擎是 Java 虚拟机最核心的组成部分之一.「虚拟机」是相对于「物理机」的概念,这两种机器都有代码执行的能力,区别是物理机的执行引擎是直接建立在处理器.硬件.指令集和操作系统层面上的,而虚拟机执行引擎是由自己实现的,因此可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式. 在 Java 虚拟机规范中制定了虚拟机字节码执行引擎的概念模型,这个概念模型成为各种虚拟机执行引擎的统…
编译器(javac)将Java源文件(.java文件)编译成Java字节码(.class文件). 类加载器负责加载编译后的字节码,并加载到运行时数据区(Runtime Data Area) 通过类加载器加载的,被分配到JVM运行时数据库的字节码会被执行引擎执行. 执行引擎以指令为单位读取Java字节码.就像CPU一样,一条一条地执行机器指令.每个字节码指令都由一个1字节的操作码和附加的操作数组成.执行引擎取得一个操作码,然后根据操作数来执行任务,完成后就继续执行下一条操作码. Java字节码是用…
如同讲汇编必先讲计算机组成原理,在开始字节码之前,我们先了解一下JVM的主要构成. 在JVM的内部,主要由如下几个部分构成: 1.数据区 方法区:存放类定义信息.字节码.常量等数据,在Sun HotSpot JVM中,这块也称为Perm Gen. 堆:创建的对象信息将放入堆中,堆内部如何实现各虚拟机各不相同,对于Sun HotSpot JVM来说又分为Young Gen和Tenured Gen,更详细描述参见<[Java性能剖析]Sun JVM内存管理和垃圾回收 > Java 栈:对于每个执行…