作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在上一篇 Helloworld 中,我们初步尝试使用了 Javassist字节编程的方式,来创建我们的方法体并通过反射调用运行了结果.大致了解到创建在使用字节码编程的时候基本离不开三个核心类:ClassPool.CtClass.CtMethod,它们分别管理着对象容器.类和方法.但是我们还少用一样就是字段:CtFields,在这一章节中我们不止会使用字段,还会创建多个不同入参类型和…
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 相对于小傅哥之前编写的字节码编程: ASM.Javassist 系列,Byte Buddy 玩法上更加高级,你可以完全不需要了解一个类和方法块是如何通过 指令码 LDC.LOAD.STORE.IRETURN... 生成出来的.就像它的官网介绍: Byte Buddy 是一个代码生成和操作库,用于在 Java 应用程序运行时创建和修改 Java 类,而无需编译器的帮助.除了 Java…
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 目录 @ 目录 目录 一.前言 二.开发环境 三.案例目标 四.技术实现 五.测试结果 1. 使用Javassist生成的类 2. 输出的测试结果 六.总结 一.前言 在字节码编程方面有三个比较常见的框架:ASM.byte-buddy.Javassist,他们都可以对这字节码进行操作,只是操作方式和控制粒度不同. 其中 ASM 更偏向于底层,需要了解 JVM 虚拟机中指定规范以及对局部变量以…
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 通过前面两篇 javassist 的基本内容,大体介绍了:类池(ClassPool).类(CtClass).属性(CtField).方法(CtMethod),的使用方式,并通过创建不同类型的入参出参方法,基本可以掌握如何使用这样的代码结构进行字节码编程. 那么,今天我们尝试使用 javassist 去修改一个正在执行中的类里面的方法内容.也就是在运行时重新加载类信息 可能在你平时的…
目前Java字节码生成框架大致有ASM.Javassist和byte buddy三种 ASM框架介绍及使用 1.ASM介绍 ASM是一种Java字节码操控框架,能够以二进制形式修改已有的类或是生成类,ASM可以直接生成二进制class文件也可以在类被加载入JVM之前动态改变类,只不过ASM在创建class字节码时说底层JVM的汇编指令,需要使用者对class组织结构和JVM汇编指令有一定的了解.由于Java 类存储在.class文件中,这些类文件中包含有:类名称.方法.属性及字节码,ASM从类文…
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 如何保证代码质量? 业务提需求,产品定方案,研发做实现,测试验流程.四种角色的相互配合是确保一个需求上线的必备条件.在整个需求的交付质量级别划分中,研发与测试是非常重的一环,如果研发提测的代码质量不高,就会出现不同级别的修BUG.返工甚至重做的风险. 那么,怎么来提高代码质量呢?一般我们都会要求研发在开发代码的过程中编写单元测试,验证自己的代码逻辑.如果最终单元测试覆盖度不足,可以…
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 片面了! 一月三舟,托尔斯泰说:"多么伟大的作家,也不过就是在书写自己的片面而已".何况是我,何况是我们! 虽然我们不书写文章,但我们写需求.写代码.写注释,当我们遇到了需要被讨论的问题点时,往往变成了争论点.这个好.那个差.你用的都是啥啥啥! 当你把路走窄了,你所能接受到的新的思路.新的想法.新的视野,以及非常重要的收入,也都会随之减少.只有横向对比.参考借鉴.查漏补缺…
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.csdn.net/qq_35925558/NOTE_JVM https://github.com/uxiahnan/NOTE_JVM 目录 1. 概述 2. 加载与存储指令 2.1. 局部变量压栈指令 局部变量压栈常用指令集 局部变量压栈指令剖析 2.2. 常量入栈指令 常量入栈常用指令集 常量入栈指令…
1. 下面是一到Java笔试题: public class Test2 { public void add(Byte b) { b = b++; } public void test() { Byte a = 127; Byte b = 127; add(++a); System.out.print(a + " "); add(b); System.out.print(b + ""); } } 2. 为方便分析起见,将打印的语句去掉,如下: public void…
与invokevirtual指令类似,当没有对目标方法进行解析时,需要调用LinkResolver::resolve_invoke()函数进行解析,这个函数会调用其它一些函数完成方法的解析,如下图所示. 上图中粉色的部分与解析invokevirtual字节码指令有所区别,resolve_pool()函数及其调用的相关函数在介绍invokevirtual字节码指令时详细介绍过,这里不再介绍. 调用LinkResolver::resolve_invokeinterface()函数对字节码指令进行解析…