之前我们已经对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小时内与您取得联系。