小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Java反射機(jī)制API

 碼農(nóng)9527 2021-09-26

    實(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()返回方法名稱。

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多