ASM Java类的基本表述

如何使用ASM生成一个简单的JAVA类,里面使用到了很多的基本概念,比如:方法描述、引用描述等,下面将一一介绍。

一、类版本:

    一个Java二进制的类文件,都有一个版本,因此ASM中提供了几个常量来指定一个类的版,这些常量定义在org.objectweb.asm.Opcodes接口中,如下:

Java代码   收藏代码
  1. int V1_1 = 3 << 16 | 45;  
  2. int V1_2 = 0 << 16 | 46;  
  3. int V1_3 = 0 << 16 | 47;  
  4. int V1_4 = 0 << 16 | 48;  
  5. int V1_5 = 0 << 16 | 49;  
  6. int V1_6 = 0 << 16 | 50;  
  7. int V1_7 = 0 << 16 | 51;  

 二、内部名字:

     在Java二进制文件中使用的是JVM的内部名字,而不是我们所熟悉的以“.”分割的全限定名,内部名字是以“/”替代“.”的全名,例如:java.lang.String在JVM中的内部名字是java/lang/String。在ASM中可以使用org.objectweb.asm.Type类中的静态方法getInternalName(final Class c) 来获得,如下:

Java代码   收藏代码
  1. public class InternalNameTransform {  
  2.   
  3.     public static void main(String[] args) {  
  4.         System.out.println(Type.getInternalName(String.class));  
  5.         System.out.println(Type.getInternalName(Integer.class));  
  6.         System.out.println(Type.getInternalName(InternalNameTransform.class));  
  7.     }  
  8. }  

    运行结果:

Java代码   收藏代码
  1. java/lang/String  
  2. java/lang/Integer  
  3. org/victorzhzh/core/structure/InternalNameTransform  

三、类型描述:

    我们知道JAVA类型分为基本类型和引用类型,在JVM中对每一种类型都有与之相对应的类型描述,如下表:

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

    在ASM中要获得一个类的JVM内部描述,可以使用org.objectweb.asm.Type类中的getDescriptor(final Class c)方法,如下:

Java代码   收藏代码
  1. public class TypeDescriptors {  
  2.     public static void main(String[] args) {  
  3.         System.out.println(Type.getDescriptor(TypeDescriptors.class));  
  4.         System.out.println(Type.getDescriptor(String.class));  
  5.     }  
  6.   
  7. }  

    运行结果:

Java代码   收藏代码
  1. Lorg/victorzhzh/core/structure/TypeDescriptors;  
  2. 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方法,如下:

Java代码   收藏代码
  1. public class MethodDescriptors {  
  2.     public static void main(String[] args) throws Exception {  
  3.         Method m = String.class.getMethod("substring"int.class);  
  4.         System.out.println(Type.getMethodDescriptor(m));  
  5.     }  
  6.   
  7. }  

    运行结果:

Java代码   收藏代码
  1. (I)Ljava/lang/String;  

 其实在org.objectweb.asm.Type类中提供了很多方法让我们去了解一个类,有兴趣的可以看一下它的源码,这对我们了解一个类和操作一个类还是有大帮助的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值