溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java 反射介紹

發(fā)布時間:2020-08-31 15:20:26 來源:網絡 閱讀:361 作者:nineteens 欄目:編程語言

  什么是反射?

  Java 反射,就是在運行狀態(tài)中。

  獲取任意類的名稱、package信息、所有屬性、方法、注解、類型、類加載器等

  獲取任意對象的屬性,并且能改變對象的屬性

  調用任意對象的方法

  判斷任意一個對象所屬的類

  實例化任意一個類的對象

  Java 的動態(tài)就體現(xiàn)在這。通過反射我們可以實現(xiàn)動態(tài)裝配,降低代碼的耦合度;動態(tài)代理等。反射的過度使用會嚴重消耗系統(tǒng)資源。

  JDK 中 java.lang.Class 類,就是為了實現(xiàn)反射提供的核心類之一。

  獲取 Class 的方法 、一個 jvm 中一種 Class 只會被實例化一次

  package constxiong.interview;

  /**

  * 測試 Class 類相關

  * @author ConstXiong

  * @date 2019-06-14 10:13:05

  */

  public class TestClass {

  public static void main(String[] args) throws ClassNotFoundException {

  testGetClass();

  }

  /**

  * 測試獲取 Class 對象,獲取 Class 名稱

  * @throws ClassNotFoundException

  */

  @SuppressWarnings("rawtypes")

  public static void testGetClass() throws ClassNotFoundException {

  TestClass t = new TestClass();

  Class class1 = t.getClass();

  System.out.println(class1.getName());

  Class class2 = TestClass.class;

  System.out.println(class2.getName());

  Class class3 = Class.forName("constxiong.interview.TestClass");

  System.out.println(class3.getName());

  //一個 jvm 中一種 Class 只會被實例化一次,對上面的 Class 實例進行判斷發(fā)現(xiàn)都是相等的

  System.out.println(class1 == class2);

  System.out.println(class1 == class3);

  }

  }

  Class 類中方法測試

  package constxiong.interview;

  /**

  * 測試 Class 類相關

  * @author ConstXiong

  * @date 2019-06-14 10:13:05

  */

  public class TestClass {

  private int i = 0;

  public int j = 1;

  private void t() {

  System.out.println("調用 TestClass 對象的 t() 方法");

  }

  public static void main(String[] args) throws ClassNotFoundException {

  testClassMethod();

  }

  /**

  * 測試 Class 對象的方法

  */

  public static void testClassMethod() {

  Class clazz = TestClass.class;

  System.out.println("clazz.getName() --> " + clazz.getName());//獲取類全名(包含路徑)

  System.out.println();

  System.out.println("clazz.getSimpleName() --> " + clazz.getSimpleName());//獲取類簡稱

  System.out.println();

  System.out.println("clazz.getSuperclass() --> " + clazz.getSuperclass());//獲取父類

  System.out.println();

  System.out.println("clazz.isInterface() --> " + clazz.isInterface());//判斷是否為接口

  System.out.println();??無錫婦科醫(yī)院 http://mobile.wxbhnkyy39.com/

  System.out.println("clazz.getFields() --> " + join(clazz.getFields(), "\r\n"));//獲取 public 字段,包含父類 public 字段

  System.out.println();

  System.out.println("clazz.getDeclaredFields() --> " + join(clazz.getDeclaredFields(), "\r\n"));//獲取所有字段

  System.out.println();

  System.out.println("clazz.getMethods() --> " + join(clazz.getMethods(), "\r\n"));//獲取 public 方法,包含父類 public 方法

  System.out.println();

  System.out.println("clazz.getDeclaredMethods() --> " + join(clazz.getDeclaredMethods(), "\r\n"));//獲取所有字段

  System.out.println();

  System.out.println("clazz.getConstructors() --> " + join(clazz.getConstructors(), "\r\n"));//獲取構造方法

  System.out.println();

  try {

  clazz.newInstance().t();//實例化 TestClass 對象,調用對象中的 t() 方法

  } catch (InstantiationException e) {

  e.printStackTrace();

  } catch (IllegalAccessException e) {

  e.printStackTrace();

  }

  }

  /**

  * 拼接數(shù)組成字符串

  * @param objs

  * @param s

  * @return

  */

  private static String join(Object[] objs, String s) {

  StringBuilder r = new StringBuilder();

  for (Object obj : objs) {

  r.append(obj).append(s);

  }

  return r.toString();

  }

  }


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI