先看一個例子
用戶測試類
package com.reflect; public class User { private String name; private String password; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
package com.reflect; public class ReflectDemo { public static void main(String[] args) { User u=new User(); print(u.getClass().getName()); print(u.getClass().getCanonicalName()); print(u.getClass().getSimpleName()); print(args.getClass().getName()); print(args.getClass().getCanonicalName()); print(args.getClass().getSimpleName()); } public static void print(Object o) { System.out.println(o.toString()); } }
執行結果:
com.reflect.User
com.reflect.User
User
[Ljava.lang.String;
java.lang.String[]
String[]
可以看出,對於大部分class而言,getCanonicalName和getName這兩個方法沒有什么不同的, 但是對於array等就顯示出來了。
getName()方法,以String的形式,返回Class對象的‘實體’名稱;
getSimpleName()方法,是獲取源代碼中給出的‘底層類’簡稱;
上面中[Ljava.lang.String;這種表表述是JNI字段描述符
L代表類[代表數組
一個數組int[],就需要表示為這樣"[I"。如果多個數組double[][][]就需要表示為這樣 "[[[D"。也就是說每一個方括號開始,就表示一個數組維數。多個方框后面,就是數組 的類型。
如果以一個L開頭的描述符,就是類描述符,它后緊跟着類的字符串,然后分號“;”結束。
比如"Ljava/lang/String;"就是表示類型String;
"[I"就是表示int[];
"[Ljava/lang/Object;"就是表示Object[]。
JNI方法描述符,主要就是在括號里放置參數,在括號后面放置返回類型,如下:
(參數描述符)返回類型
當一個函數不需要返回參數類型時,就使用”V”來表示。
比如"()Ljava/lang/String;"就是表示String f();
"(ILjava/lang/Class;)J"就是表示long f(int i, Class c);
"([B)V"就是表示void String(byte[] bytes);
其他具體的對應關系如下
|