Java ASM系列:(038)GeneratorAdapter介绍
2021/7/4 22:22:26
本文主要是介绍Java ASM系列:(038)GeneratorAdapter介绍,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
本文属于[Java ASM系列一:Core API](https://blog.51cto.com/lsieun/2924583)当中的一篇。 对于`GeneratorAdapter`类来说,它非常重要的一个特点:将一些`visitXxxInsn()`方法封装成一些常用的方法。 ## 1. GeneratorAdapter类 ### 1.1 class info 第一个部分,`GeneratorAdapter`类继承自`LocalVariablesSorter`类。 - org.objectweb.asm.MethodVisitor - org.objectweb.asm.commons.LocalVariablesSorter - org.objectweb.asm.commons.GeneratorAdapter - org.objectweb.asm.commons.AdviceAdapter ```java public class GeneratorAdapter extends LocalVariablesSorter { } ``` ### 1.2 fields 第二个部分,`GeneratorAdapter`类定义的字段有哪些。 ```java public class GeneratorAdapter extends LocalVariablesSorter { private final int access; private final String name; private final Type returnType; private final Type[] argumentTypes; } ``` ### 1.3 constructors 第三个部分,`GeneratorAdapter`类定义的构造方法有哪些。 ```java public class GeneratorAdapter extends LocalVariablesSorter { public GeneratorAdapter(final MethodVisitor methodVisitor, final int access, final String name, final String descriptor) { this(Opcodes.ASM9, methodVisitor, access, name, descriptor); } protected GeneratorAdapter(final int api, final MethodVisitor methodVisitor, final int access, final String name, final String descriptor) { super(api, access, descriptor, methodVisitor); this.access = access; this.name = name; this.returnType = Type.getReturnType(descriptor); this.argumentTypes = Type.getArgumentTypes(descriptor); } } ``` ### 1.4 methods 第四个部分,`GeneratorAdapter`类定义的方法有哪些。 ```java public class GeneratorAdapter extends LocalVariablesSorter { public int getAccess() { return access; } public String getName() { return name; } public Type getReturnType() { return returnType; } public Type[] getArgumentTypes() { return argumentTypes.clone(); } } ``` ## 2. 特殊方法举例 `GeneratorAdapter`类的特点是将一些`visitXxxInsn()`方法封装成一些常用的方法。在这里,我们给大家举几个有代表性的例子,更多的方法可以参考`GeneratorAdapter`类的源码。 ### 2.1 loadThis 在`GeneratorAdapter`类当中,`loadThis()`方法的本质是`mv.visitVarInsn(Opcodes.ALOAD, 0)`;但是,要注意static方法并不需要`this`变量。 ```java public class GeneratorAdapter extends LocalVariablesSorter { public void loadThis() { if ((access & Opcodes.ACC_STATIC) != 0) { // 注意,静态方法没有this throw new IllegalStateException("no 'this' pointer within static method"); } mv.visitVarInsn(Opcodes.ALOAD, 0); } } ``` ### 2.2 arg 在`GeneratorAdapter`类当中,定义了一些与方法参数相关的方法。 ```java public class GeneratorAdapter extends LocalVariablesSorter { private int getArgIndex(final int arg) { int index = (access & Opcodes.ACC_STATIC) == 0 ? 1 : 0; for (int i = 0; i < arg; i++) { index += argumentTypes[i].getSize(); } return index; } private void loadInsn(final Type type, final int index) { mv.visitVarInsn(type.getOpcode(Opcodes.ILOAD), index); } private void storeInsn(final Type type, final int index) { mv.visitVarInsn(type.getOpcode(Opcodes.ISTORE), index); } public void loadArg(final int arg) { loadInsn(argumentTypes[arg], getArgIndex(arg)); } public void loadArgs(final int arg, final int count) { int index = getArgIndex(arg); for (int i = 0; i < count; ++i) { Type argumentType = argumentTypes[arg + i]; loadInsn(argumentType, index); index += argumentType.getSize(); } } public void loadArgs() { loadArgs(0, argumentTypes.length); } public void loadArgArray() { push(argumentTypes.length); newArray(OBJECT_TYPE); for (int i = 0; i < argumentTypes.length; i++) { dup(); push(i); loadArg(i); box(argumentTypes[i]); arrayStore(OBJECT_TYPE); } } public void storeArg(final int arg) { storeInsn(argumentTypes[arg], getArgIndex(arg)); } } ``` ### 2.3 boxing and unboxing 在`GeneratorAdapter`类当中,定义了一些与boxing和unboxing相关的操作。 ```java public class GeneratorAdapter extends LocalVariablesSorter { public void box(final Type type) { if (type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY) { return; } if (type == Type.VOID_TYPE) { push((String) null); } else { Type boxedType = getBoxedType(type); newInstance(boxedType); if (type.getSize() == 2) { dupX2(); dupX2(); pop(); } else { dupX1(); swap(); } invokeConstructor(boxedType, new Method("这篇关于Java ASM系列:(038)GeneratorAdapter介绍的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南