本文主要是介绍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类中提供了很多方法让我们去了解一个类,有兴趣的可以看一下它的源码,这对我们了解一个类和操作一个类还是有大帮助的。
这篇关于ASM Java类的基本表述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!