`
victorzhzh
  • 浏览: 202179 次
  • 来自: ...
社区版块
存档分类
最新评论

ASM系列之二:Java类的基本表述

阅读更多

    上一篇文章中我们看到了如何使用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类中提供了很多方法让我们去了解一个类,有兴趣的可以看一下它的源码,这对我们了解一个类和操作一个类还是有大帮助的。

 

 

 

 

分享到:
评论
1 楼 Willam2004 2011-01-25  

相关推荐

    ASM操作字节码,动态生成Java类class文件

    ASM操作字节码,动态生成Java类class文件,模拟Spring的AOP实现原理。

    asm操作指南(中文)

    ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性...

    asm4-guide.pdf

    ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性...

    asm-analysis-5.0.3.jar

    asm-analysis-5.0.3.jar;asm-analysis-5.0.3.jar;asm-analysis-5.0.3.jar

    asm3.1.jar

    我学习spring程序,测试程序时.老出bug, 后来从网上找原因说asm.jar版本太低 现把好不容易找来的jar包共享给大家

    ASM4中文使用指南.zip

    ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性...

    asm-5.0.4-API文档-中文版.zip

    Maven坐标:org.ow2.asm:asm:5.0.4; 标签:ow2、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,...

    asm-9.0.jar

    ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性...

    asm-examples:Java ASM示例(http

    例子Java ASM示例( )

    java-asm:java asm原始解析

    java-asm java asm原始解析

    asm-9.1-API文档-中文版.zip

    Maven坐标:org.ow2.asm:asm:9.1; 标签:ow2、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...

    java asm 3.3.1

    java asm jar包,包含doc已经pom,自己从官网下载的,无删减。

    asm5.0 源码+demo+doc

    ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性...

    ASM 帮助文档(java字节码操作)

    ASM 帮助文档(java字节码操作) 对字节码进行操作的jar包。

    asm 最新版手册

    ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性...

    asm.jar各个版本

    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-7.1-API文档-中英对照版.zip

    Maven坐标:org.ow2.asm:asm:7.1; 标签:ow2、jar包、java、中英对照文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和...

    ASM4.0 中文教程与多种字节码编程实战案例

    内容包含ASM4.0中文手册,以及四种ASM常见的字节码操作应用范例,包含最新版本的ASM9.2的jar包,包含asm-9.2.jar,asm-commons-9.2.jar,asm-util-9.2.jar。 学习文章地址 ...

    yuandaima.rar_asm 程序_site:www.pudn.com_随机数

    这是几个asm小程序。包括判断某一年是否为润年的程序;产生随机数并运算的程序;计算平台长度程序等

    Java字节码操纵框架 asm-3.1组件包大集合

    ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性...

Global site tag (gtag.js) - Google Analytics