全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

java字节码框架ASM操作字节码的方法浅析

之前我们已经对ASM进行的详细的介绍,需要的朋友们可以点击这里:java字节码框架ASM的深入学习

JVM的类型签名对照表

Type Signature Java Type
Z boolean
B byte
C char
S short
I int
J long
F float
D double
L fully-qualified-class ;fully-qualified-class
[ type type[]
( arg-types ) ret-type method type

比如,java方法是

long f (int n, String s, int[] arr);

对应的类型签名就是

f (ILjava/lang/String;[I)J

再比如,java方法是

private void hi(double a, List<String> b);

那对应的类型签名就是

hi (DLjava/util/List;)V

接下来可以利用ASM进行验证上述两个类型签名是否正确:

public class Test {

 public static void main(String[] args) throws Exception {
 ClassPrinter printer = new ClassPrinter();
 //读取静态内部类Bazhang
 ClassReader cr = new ClassReader("Test$Bazhang");
 cr.accept(printer, 0);

 }

 //静态内部类
 static class Bazhang {

 public Bazhang(int a) {
 }

 private long f (int n, String s, int[] arr){
  return 0;
 }

 private void hi(double a, List<String> b){

 }
 }

 static class ClassPrinter extends ClassVisitor {

 public ClassPrinter() {
  super(Opcodes.ASM5);
 }

 @Override
 public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
  super.visit(version, access, name, signature, superName, interfaces);
  //打印出父类name和本类name
  System.out.println(superName + " " + name);
 }

 @Override
 public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
  //打印出方法名和类型签名
  System.out.println(name + " " + desc);
  return super.visitMethod(access, name, desc, signature, exceptions);
 }
 }

}

最后打印出来的内容:

java/lang/Object Test$Bazhang
<init> ()V
f (ILjava/lang/String;[I)J
hi (DLjava/util/List;)V

验证了之前的正确性,其中可以看到默认构造函数也打印出来了。

那么接下来干点有意思的事,我们往Bazhang类里新增和方法,就定为:

public void newFunc(String str){
 
}

这个时候就需要用到ClassWriter了,用于拼接字节码,具体关于ClassReader、ClassVisitor、ClassWriter的文章可以查看这篇文章:ASM源码学习之ClassReader、ClassVisitor与ClassWriter详解

public static void main(String[] args) throws Exception {
 ClassReader cr = new ClassReader(Bazhang.class.getName());
 ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS);

 cr.accept(cw, Opcodes.ASM5);

 MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "newFunc", "(Ljava/lang/String;)V", null, null);

 mv.visitInsn(Opcodes.RETURN);
 mv.visitEnd();

 // 获取生成的class文件对应的二进制流
 byte[] code = cw.toByteArray();
 
 //将二进制流写到out/下
 FileOutputStream fos = new FileOutputStream("out/Bazhang222.class");
 fos.write(code);
 fos.close();

}

这样就会在out/文件夹下生成Bazhang222.class:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

import java.util.List;

class Test$Bazhang {
 Test$Bazhang() {
 }

 private long f(int n, String s, int[] arr) {
 return 0L;
 }

 private void hi(double a, List<String> b) {
 }

 public void newFunc(String var1) {
 }
}

结合之前整理的JVM指令集,使用ASM直接操作字节码也是没问题的,结尾附上ASM源码下载地址http://forge.ow2.org/projects/asm/

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。


# java  # 字节码  # 字节码工具  # 字节码转换  # 学会Java字节码指令  # 成为技术大佬  # Java之字节码以及优势案例讲解  # Java字节码增强技术知识点详解  # 详解Java动态字节码技术  # 详解Java字节码编程之非常好用的javassist  # 浅谈javap命令拆解字节码文件  # Java字节码中jvm实例用法  # Javassist如何操作Java 字节码  # Java中invokedynamic字节码指令问题  # java获取版本号及字节码编译版本方法示例  # java 获取字节码文件的几种方法总结  # java 中如何获取字节码文件的相关内容  # java字节码框架ASM的深入学习  # Java 将字符串动态生成字节码的实现方法  # 通过java字节码分析学习对象初始化顺序  # Java字节码的增强技术  # 这篇文章  # 下载地址  # 会在  # 本类  # 朋友们  # 点击这里  # 可以看到  # 这个时候  # 写到  # 可以利用  # 可以查看  # 是否正确  # 对照表  # 打印出来  # 干点  # 指令集  # 有意思  # 出来了  # 有疑问  # ClassReader 


相关文章: 如何在腾讯云免费申请建站?  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  制作农业网站的软件,比较好的农业网站推荐一下?  建站之星备案流程有哪些注意事项?  股票网站制作软件,网上股票怎么开户?  如何通过服务器快速搭建网站?完整步骤解析  网站企业制作流程,用什么语言做企业网站比较好?  宁波自助建站系统如何快速打造专业企业网站?  建站主机默认首页配置指南:核心功能与访问路径优化  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  临沂网站制作公司有哪些,临沂第四中学官网?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  湖北网站制作公司有哪些,湖北清能集团官网?  做企业网站制作流程,企业网站制作基本流程有哪些?  建站为何优先选择香港服务器?  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  建站主机核心功能解析:服务器选择与网站搭建流程指南  建站之星后台密码遗忘或太弱?如何重置与强化?  建站之星后台密码遗忘如何找回?  ,怎么用自己头像做动态表情包?  建站之星如何实现网站加密操作?  建站主机选购指南与交易推荐:核心配置解析  如何在宝塔面板创建新站点?  建站之星CMS五站合一模板配置与SEO优化指南  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  招商网站制作流程,网站招商广告语?  山东云建站价格为何差异显著?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  高防服务器租用如何选择配置与防御等级?  如何在云主机快速搭建网站站点?  油猴 教程,油猴搜脚本为什么会网页无法显示?  专业公司网站制作公司,用什么语言做企业网站比较好?  营销式网站制作方案,销售哪个网站招聘效果最好?  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?    购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  建站VPS选购需注意哪些关键参数?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  c# await 一个已经完成的Task会发生什么  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  学校为何禁止电信移动建设网站?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  建站主机如何选?高性价比方案全解析  建站之星安装模板失败:服务器环境不兼容?  制作网页的网站有哪些,电脑上怎么做网页?  建站主机系统SEO优化与智能配置核心关键词操作指南  活动邀请函制作网站有哪些,活动邀请函文案?  Python如何创建带属性的XML节点 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。