上一篇文章中我们看到了如何使用ASM生成一个简单的JAVA类,里面使用到了很多的基本概念,比如:方法描述、引用描述等,下面将一一介绍。
一、类版本:
一个Java二进制的类文件,都有一个版本,因此ASM中提供了几个常量来指定一个类的版,这些常量定义在org.objectweb.asm.Opcodes接口中,如下:
int V1_1 = 3 << 16 | 45;
int V1_2 = 0 << 16 | 46;
int V1_3 = 0 << 16 | 47;
int V1_4 = 0 << 16 | 48;
int V1_5 = 0 << 16 | 49;
int V1_6 = 0 << 16 | 50;
int V1_7 = 0 << 16 | 51;
二、内部名字:
在Java二进制文件中使用的是JVM的内部名字,而不是我们所熟悉的以“.”分割的全限定名,内部名字是以“/”替代“.”的全名,例如:java.lang.String在JVM中的内部名字是java/lang/String。在ASM中可以使用org.objectweb.asm.Type类中的静态方法getInternalName(final Class c) 来获得,如下:
public class InternalNameTransform {
public static void main(String[] args) {
System.out.println(Type.getInternalName(String.class));
System.out.println(Type.getInternalName(Integer.class));
System.out.println(Type.getInternalName(InternalNameTransform.class));
}
}
运行结果:
java/lang/String
java/lang/Integer
org/victorzhzh/core/structure/InternalNameTransform
三、类型描述:
我们知道JAVA类型分为基本类型和引用类型,在JVM中对每一种类型都有与之相对应的类型描述,如下表:
Java类型 |
JVM中的描述 |
boolean |
Z |
char |
C |
byte |
B |
short |
S |
int |
I |
float |
F |
long |
J |
double |
D |
Object |
Ljava/lang/Object; |
int |
[I |
Object |
[[Ljava/lang/Object; |
在ASM中要获得一个类的JVM内部描述,可以使用org.objectweb.asm.Type类中的getDescriptor(final Class c)方法,如下:
public class TypeDescriptors {
public static void main(String[] args) {
System.out.println(Type.getDescriptor(TypeDescriptors.class));
System.out.println(Type.getDescriptor(String.class));
}
}
运行结果:
Lorg/victorzhzh/core/structure/TypeDescriptors;
Ljava/lang/String;
四、方法描述:
在Java的二进制文件中,方法的方法名和方法的描述都是存储在Constant pool中的,且在两个不同的单元里。因此,方法描述中不含有方法名,只含有参数类型和返回类型,如下:
方法描述,在类中的 |
方法描述,在二进制文件中的 |
void a(int i,float f) |
(IF)V |
void a(Object o) |
(Ljava/lang/Object;)V |
int a(int i,String s) |
(ILjava/lang/String;)I |
int[] a(int[] i) |
([I)[I |
String a() |
()Ljava/lang/String; |
获取一个方法的描述可以使用org.objectweb.asm.Type.getMethodDescriptor方法,如下:
public class MethodDescriptors {
public static void main(String[] args) throws Exception {
Method m = String.class.getMethod("substring", int.class);
System.out.println(Type.getMethodDescriptor(m));
}
}
运行结果:
(I)Ljava/lang/String;
其实在org.objectweb.asm.Type类中提供了很多方法让我们去了解一个类,有兴趣的可以看一下它的源码,这对我们了解一个类和操作一个类还是有大帮助的。
分享到:
相关推荐
ASM是一个开源的Java字节码操控和分析框架,它能够用来动态生成类或者增强已有类的功能。ASM可以被用来创建Java代理、实现元编程、甚至深入到Java虚拟机(JVM)层面进行性能优化。在Java开发中,ASM库允许我们直接...
通过直接生成二进制`.class`文件,ASM能够在类被加载到Java虚拟机之前动态地改变类的行为。 - **应用场景**: - **程序分析**:用于查找应用程序中的潜在错误、检测未使用的代码以及实现代码逆向工程。 - **程序...
Maven坐标:org.ow2.asm:asm:9.1; 标签:ow2、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...
在深入学习Java字节码和ASM之前,我们需要先理解Java编译和运行的基本过程。 1. **Java编译过程**: 当我们编写Java源代码(.java文件)后,Java编译器(javac)将这些源代码转换为字节码(.class文件)。字节码是...
ASM 6.0 工具集是一套强大的Java字节码操作框架,广泛用于动态代码生成、字节码分析和转换。这套工具包括了ASM、ASM-Util、ASM-TREE和ASM-ANALYSIS等组件,每个都有其特定的功能和用途。 **ASM库**是核心部分,提供...
`Type` 类是ASM库的一个关键组成部分,它提供了对Java类型表示的支持,包括基本类型、数组类型和引用类型。当你看到 `NoClassDefFoundError` 而不是直接的 `ClassNotFoundException` 时,通常意味着类在编译时是可用...
asm-1.3.3.jar, asm-1.3.4.jar, asm-1.3.5.jar, asm-1.4.1.jar, asm-1.4.2.jar, asm-1.4.3.jar, asm-1.4.jar, asm-1.5.1.jar, asm-1.5.2.jar, asm-1.5.3.jar, asm-2.0.jar, asm-2.1.jar, asm-2.2.1-sources.jar, asm...
**范围**:ASM库主要用于处理Java类的字节码文件,包括但不限于类的读取、写入、转换和分析等功能。需要注意的是,类的加载过程不在ASM的处理范围内。 **模型**:ASM提供了两种API模型来实现类的生成和转换功能: ...
ASM库可以直接生成和修改Java类的字节码,为开发者提供了深入操作Java虚拟机(JVM)的能力。"asm-all-3.3"是ASM框架的一个版本集合,包含了3.3版本的所有组件和相关资源。 在ASM 3.3中,核心组件主要包括以下几个...
ASM是一个Java字节码操控和分析框架,它能够用来动态生成类或者增强已有类的功能。ASM库通常被用于编译器、代码分析工具以及一些需要在运行时修改Java类的框架。 描述中提到的“asm, util, jar.zip包下载, 依赖包”...
ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性...
在这个“java-asm:java asm原始解析”主题中,我们将深入探讨ASM的核心概念、使用场景和具体实践。 **核心概念** 1. **字节码**: Java字节码是Java虚拟机(JVM)能够理解的语言,它是编译后的Java源代码的二进制...
在给定的“yuandaima.rar_asm 程序_site:www.pudn.com_随机数”压缩包中,包含了一系列用汇编语言(ASM)编写的程序,这些程序涵盖了多个计算机科学基础概念和应用。以下是每个文件的主要知识点: 1. **案例1:判断...
我学习spring程序,测试程序时.老出bug, 后来从网上找原因说asm.jar版本太低 现把好不容易找来的jar包共享给大家
ASM4是中国Java开发者常用的一款字节码操作框架ASM的第四个主要版本,它主要用于动态生成和分析Java字节码。ASM是一个低级别的库,可以直接操作和生成类的字节码,这在创建编译器、代码分析工具以及运行时代码修改等...
ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性...
- **Core API**:基于事件的模型,将Java类表示为一系列事件,每个事件对应类的一个元素,如类头、字段、方法等。这种模式类似于XML的SAX解析。 - **Tree API**:基于对象的模型,将Java类视为一个对象树,每个...
ASM的强大之处在于其灵活性,但同时也要求使用者对Java虚拟机的内部结构有较深入的理解。ASM通常被用于编译器、代码分析工具或动态代理框架的底层实现,比如cglib就是利用ASM来生成和修改字节码。 CGlib与ASM的关系...
Java ASM 是一个强大的字节码操纵和分析框架,主要用于动态生成和修改Java类。ASM库在Java编程领域中尤其在创建、分析和修改字节码时具有广泛的应用,例如在AOP(面向切面编程)、代码混淆、性能监控以及自定义字节...