
java描述符
類型描述符
基元類型的描述符是單個(gè)字符:Z 表示 boolean,C 表示 char,B 表示 byte,S 表示 short, I 表示 int,F(xiàn) 表示 float,J 表示 long,D 表示 double。一個(gè)類類型的描述符是這個(gè)類的 內(nèi)部名,前面加上字符 L,后面跟有一個(gè)分號。例如,String 的類型描述符為 Ljava/lang/String;。而一個(gè)數(shù)組類型的描述符是一個(gè)方括號后面跟有該數(shù)組元素類型的描述符。
| Java類型 | 類型描述符 |
|---|---|
| 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; |
| String | Ljava/lang/String; |
[圖片上傳失敗...(image-6ab1d7-1628323272513)]
方法描述符
方法描述符是一個(gè)類型描述符列表,它用一個(gè)字符串描述一個(gè)方法的參數(shù)類型和返回類型。 方法描述符以左括號開頭,然后是每個(gè)形參的類型描述符,然后是一個(gè)右括號,接下來是返回類 型的類型描述符,如果該方法返回 void,則是 V(方法描述符中不包含方法的名字或參數(shù)名)。
| 源文件中的方法聲明 | 方法描述符 |
|---|---|
| void m(int i, float f) | (IF)V |
| int m(Object o) | (Ljava/lang/Object;)I |
| int[]m(inti,Strings) | (ILjava/lang/String;)[I |
| Object m(int[] i) | ([I)Ljava/lang/Object; |
一旦知道了類型描述符如何工作,方法描述符的理解就容易了。例如,(I)I述一個(gè)方法,它接受一個(gè) int 類型的參數(shù),返回一個(gè) int。
借助ASM工具類實(shí)現(xiàn)
可以借助asm中的org.objectweb.asm.Type來幫助我們獲得類型描述符和方法描述符。
import org.objectweb.asm.Type;
import java.lang.reflect.Method;
import java.util.Map;
public class TypeSample {
public static void main(String[] args) throws Exception{
System.out.println(Type.getInternalName(String.class));//java/lang/String
System.out.println(Type.getInternalName(Map.class));//java/util/Map
String descriptor = Type.getDescriptor(String.class);
System.out.println(descriptor); //Ljava/lang/String;
System.out.println(Type.INT_TYPE.getDescriptor());//I
Method mainMathod = TypeSample.class.getDeclaredMethod("main", String[].class);
System.out.println(Type.getMethodDescriptor(mainMathod));//([Ljava/lang/String;)V
}
}
分類:java基礎(chǔ)
在這里插入圖片描述