|
實(shí)現(xiàn)Java反射機(jī)制的類都位于java.lang.reflect包中,java.lang.Class類是Java反射機(jī)制API中的核心類。本節(jié)將從這兩個(gè)方面講解Java反射機(jī)制API。 java.lang.Class類java.lang.Class類是實(shí)現(xiàn)反射的關(guān)鍵所在,Class類的一個(gè)實(shí)例表示Java的一種數(shù)據(jù)類型,包括類、接口、枚舉、注解(Annotation)、數(shù)組、基本數(shù)據(jù)類型和void。Class沒有公有的構(gòu)造方法,Class實(shí)例是由JVM在類加載時(shí)自動創(chuàng)建的。 在程序代碼中獲得Class實(shí)例可以通過如下代碼實(shí)現(xiàn): // 1. 通過類型class靜態(tài)變量Class clz1 = String.class; String str = "Hello";// 2. 通過對象的getClass()方法Class clz2 = str.getClass();12345復(fù)制代碼類型:[java] 每一種類型包括類和接口等,都有一個(gè)class靜態(tài)變量可以獲得Class實(shí)例。另外,每一個(gè)對象都有g(shù)etClass()方法可以獲得Class實(shí)例,該方法是由Object類提供的實(shí)例方法。 Class類提供了很多方法可以獲得運(yùn)行時(shí)對象的相關(guān)信息,下面的程序代碼展示了其中一些方法。 public class ReflectionTest01 { public static void main(String[] args) { // 獲得Class實(shí)例
// 1.通過類型class靜態(tài)變量
Class clz1 = String.class;
String str = "Hello"; // 2.通過對象的getClass()方法
Class clz2 = str.getClass(); // 獲得int類型Class實(shí)例
Class clz3 = int.class; // 獲得Integer類型Class實(shí)例
Class clz4 = Integer.class;
System.out.println("clz2類名稱:" + clz2.getName());
System.out.println("clz2是否為接口:" + clz2.isInterface());
System.out.println("clz2是否為數(shù)組對象:" + clz2.isArray());
System.out.println("clz2父類名稱:" + clz2.getSuperclass().getName());
System.out.println("clz2是否為基本類型:" + clz2.isPrimitive());
System.out.println("clz3是否為基本類型:" + clz3.isPrimitive());
System.out.println("clz4是否為基本類型:" + clz4.isPrimitive());
}
}123456789101112131415161718192021復(fù)制代碼類型:[java]運(yùn)行結(jié)果如下: clz2類名稱:java.lang.String clz2是否為接口:falseclz2是否為數(shù)組對象:falseclz2父類名稱:java.lang.Object clz2是否為基本類型:falseclz3是否為基本類型:trueclz4是否為基本類型:false1234567復(fù)制代碼類型:[java] 注意上述代碼第10行和第12行的區(qū)別。int是基本數(shù)據(jù)類型,所以輸出結(jié)果為true;Integer是類,是引用數(shù)據(jù)類型,所以輸出結(jié)果為false。 java.lang.reflect包java.lang.reflect包提供了反射中用到類,主要的類說明如下: Constructor類:提供類的構(gòu)造方法信息。 Field類:提供類或接口中成員變量信息。 Method類:提供類或接口成員方法信息。 Array類:提供了動態(tài)創(chuàng)建和訪問Java數(shù)組的方法。 Modifier類:提供類和成員訪問修飾符信息。 示例代碼如下: public class ReflectionTest02 { public static void main(String[] args) { try { // 動態(tài)加載xx類的運(yùn)行時(shí)對象
Class c = Class.forName("java.lang.String"); // 獲取成員方法集合
Method[] methods = c.getDeclaredMethods(); // 遍歷成員方法集合
for (Method method : methods) { // 打印權(quán)限修飾符,如public、protected、private
System.out.print(Modifier.toString(method.getModifiers())); // 打印返回值類型名稱
System.out.print(" " + method.getReturnType().getName() + " "); // 打印方法名稱
System.out.println(method.getName() + "();");
}
} catch (ClassNotFoundException e) {
System.out.println("找不到指定類");
}
}
}12345678910111213141516171819202122復(fù)制代碼類型:[java]上述代碼第5行是通過Class的靜態(tài)方法forName(String)創(chuàng)建某個(gè)類的運(yùn)行時(shí)對象,其中的參數(shù)是類全名字符串,如果在類路徑中找不到這個(gè)類則拋出ClassNotFoundException異常,見代碼第17行。 代碼第7行是通過Class的實(shí)例方法getDeclaredMethods()返回某個(gè)類的成員方法對象數(shù)組。代碼第9行是遍歷成員方法集合,其中的元素是Method類型。 代碼第11行的method.getModifiers()方法返回訪問權(quán)限修飾符常量代碼,是int類型,例如1代表public,這些數(shù)字代表的含義可以通過Modifier.toString(int)方法轉(zhuǎn)換為字符串。代碼第13行通過Method的getReturnType()方法獲得方法返回值類型,然后再調(diào)用getName()方法返回該類型的名稱。代碼第15行method.getName()返回方法名稱。 |
|
|