当前位置: 首页 > news >正文

wordpress 商业模式/百度刷排名seo软件

wordpress 商业模式,百度刷排名seo软件,成都 企业 网站建设,施工企业会计课后答案ASM字节码基础一、几个重要概念1.1 内部名1.2 类型描述符1.3 方法描述符存疑:有范型类型怎么表示?1.4 回头看,总结内部名、类型描述符、方法描述符三个概念的关系二、ASM的核心api2.1 ClassReader: 读取class二进制字节码文件到内存中2.2 Cla…

ASM字节码基础

      • 一、几个重要概念
        • 1.1 内部名
        • 1.2 类型描述符
        • 1.3 方法描述符
        • 存疑:有范型类型怎么表示?
        • 1.4 回头看,总结内部名、类型描述符、方法描述符三个概念的关系
      • 二、ASM的核心api
        • 2.1 ClassReader: 读取class二进制字节码文件到内存中
        • 2.2 ClassVisitor:定义的方法对应类的各个结构部分
        • 2.3 ClassWriter:将ClassReader读入到内存的字节码重写回文件中
      • 三、常见字节码修改逻辑的模版代码

一、几个重要概念

ASM官网

1.1 内部名

已编译的类中,类或接口类型使用内部名表示。
一个类的内部名就是这个类的全限定名,并将其中的点号换成/表示。
例如:String的内部名是java/lang/String

1.2 类型描述符

除了类或接口类型之外的其他类型,在已编译类中都是用类型描述符表示的。

Java类型类型描述符
booleanZ
charC
byteB
shortS
intI
floatF
longJ
doubleD
ObjectLjava/lang/Object;
int[][I
Object[][][[Ljava/lang/Object;

规律如下:

  • 几个特殊的基本数据类型,boolean类型是Z,long类型是J,其他都是首字母大小
  • 基础数据类型是单个字符,末尾无分号
  • 类类型的描述符=L + 内部名 + ;
  • 数组类型的描述符是左方括号后面跟该数组元素类型的描述符:
    Object[] --> [Ljava/lang/Object;
    Object[][] --> [[Ljava/lang/Object;

切记: 类描述符末尾的分号不能丢!!

1.3 方法描述符

(类型0的描述符类型1的描述符…)返回类型描述符

举例:

源文件中的方法声明方法描述符
void m(int i, float f)(IF)V
int m(Object)(Ljava/lang/Object;)I
int[] m(int i, String s)(ILjava/lang/String;)[I
Object m(int[] i)([I)Ljava/lang/Object;

存疑:有范型类型怎么表示?

这个问题,其实很好确定,使用javap -verbose 查看一下带有范型类型的源码对应的字节码即可。
例如:

  • 源码:
import java.util.ArrayList;
import java.util.List;public class Main {public static void main(String[] args) throws Exception {List<String> list = new ArrayList<>();System.out.println(list);}
}
  • javap -verbose查看字节码:
{public com.yyg.asmdemo.Main();descriptor: ()Vflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 6: 0LocalVariableTable:Start  Length  Slot  Name   Signature0       5     0  this   Lcom/yyg/asmdemo/Main;public static void main(java.lang.String[]) throws java.lang.Exception;descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=2, args_size=10: new           #2                  // class java/util/ArrayList3: dup4: invokespecial #3                  // Method java/util/ArrayList."<init>":()V7: astore_18: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;11: aload_112: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V15: returnLineNumberTable:line 8: 0line 9: 8line 10: 15LocalVariableTable:Start  Length  Slot  Name   Signature0      16     0  args   [Ljava/lang/String;8       8     1  list   Ljava/util/List;LocalVariableTypeTable:Start  Length  Slot  Name   Signature8       8     1  list   Ljava/util/List<Ljava/lang/String;>; // Ljava/util/List<Ljava/lang/String;>; 就是List<String>的类型描述符Exceptions:throws java.lang.Exception
}

范型类型会在运行时被擦除,但是字节码插桩还是针对的字节码,属于编译时,而且ASM能作用的时间节点只能是编译时,不包括运行时。

1.4 回头看,总结内部名、类型描述符、方法描述符三个概念的关系

内部名称-类型描述符-方法描述符概念关系

  • 有了内部名的概念,就能表示类或接口类型的类型描述符
  • 有了类型描述符,就能够表示方法描述符
    因为描述一个方法跟具体的方法名无关,区分不同方法的标识是参数列表+返回值类型,所以方法描述符又需要类型描述符的概念铺垫。这三个概念是层层递进的关系的。

二、ASM的核心api

2.1 ClassReader: 读取class二进制字节码文件到内存中

2.2 ClassVisitor:定义的方法对应类的各个结构部分

2.3 ClassWriter:将ClassReader读入到内存的字节码重写回文件中

一般实现修改字节码的模板代码:

// (1) 第一步:获取clazz字节码文件的路径,也就是编译好的.class文件
Class clazz = XXX.class;
String classFilePath = Utils.getClassFilePath(clazz)
//(2)第二步:创建ClassReader对象,把class文件的二进制流作为参数传入ClassReader对象
ClassReader classReader = new ClassReader(new FileInputStream(classFilePath));
//(3)第三步:创建需要解析、修改的ClasVisitor对象
ClassWriter classWriter = new ClassWriter(classReader, ClassWriter.COMPUTE_MAXS);
//(4)第四步:创建自定义的ClassVisitor(ClassWriter),并将classReader对象作为参数传入
MyClassVisitor myClassVisitor = new MyClassVisitor(Opcodes.AMS5, classWriter);
//(5)第五步:调用classReader.accept(classVisitor, 0)
classReader.accept(myClassVisitor, 0);
//(6)在MyClassVisitor中实现字节码的修改逻辑,FieldVisitor、MethodVisitor等内部方法的逻辑编写。

三、常见字节码修改逻辑的模版代码

操作逻辑实现方案模板代码注意事项
给类新增字段在ClassVisitor#visitEnd()中编写逻辑在这里插入图片描述fv.visitEnd()和cv.visitEnd()不能漏写
给类方法的开头新增代码在自定义的MethodVisitor#visitCode中编写代码在这里插入图片描述
给类方法的末尾新增代码在自定义的MethodVisitor#visitInsn中编写代码,并且前置条件(opcode >= Opcodes.IRETURN && opcode <= Opcodes.RETURN) or opcode == Opcodes.ATHROW为true在这里插入图片描述
http://www.lbrq.cn/news/1477117.html

相关文章:

  • 俄语在线网站制作/上海专业做网站
  • 怎么设网站/网络广告营销策划方案
  • 网页设计流行趋势/免费seo网站的工具
  • 网站备份数据库/培训机构排名一览表
  • 建筑网站绿地新里城/b2b平台运营模式
  • 设计做兼职的网站求推荐/营销推广公司
  • 兰州拼团网站建设/实训百度搜索引擎的总结
  • 专门做ppt的网站斧头/制作一个网站的流程有哪些
  • python 网站开发 sae/河南网站推广
  • 机械公司网站建设/百度推广没有效果怎么办
  • html展示网站源代码/百度一下百度首页官网
  • 企业网站的基本功能有哪些/网络营销前景和现状分析
  • 做淘宝网站用什么软件做/百度站长平台网站提交
  • 企业网站域名注册查询/it培训班大概需要多少钱
  • 如何建设公司门户网站/seo标题生成器
  • 政务系统网站建设/天津seo技术教程
  • 做网站去哪个公司/网站建站价格
  • 个人网站不能做淘宝客/5118网站查询
  • 潍坊企业自助建站系统/百度app安装下载免费
  • 效果图网站有哪些好的/衡阳seo服务
  • 网站模板 阿里/技术教程优化搜索引擎整站
  • 向网站上传文件怎么做/网站案例分析
  • 网站域名变更/互联网登录的网站名
  • 上海在线网站/游戏推广接单平台
  • 临沂市建设工程监理公司网站/电商运营转行后悔了
  • 呼和浩特建站/沈阳网站关键词排名
  • 潮州市建设局官方网站/网站有哪些平台
  • 网站建设 荆州/seo霸屏软件
  • 怎么把园林设计网站做的酷炫/推广引流方法与渠道
  • 网站建设应遵循的原则/外贸网站优化
  • Flutter镜像替换
  • Flutter基础知识
  • Implement recovery based on PITR using dump file and binlog
  • 流式编程终端操作
  • 常见框架漏洞
  • 蓝桥杯----DA、AD