一、Java反射機制概述
Reflection(反射)是被視爲動態語言的關鍵,反射機制允許程序在執行期藉助於Reflection API
取得任何類的內部信息,並能直接操作任意對象的內部屬性及方法。
正確方式: 引入需要的“包類”名稱 --> 通過new實例化 --> 獲取實例對象
反射方式: 實例化對象 --> getClass()方法 --> 得到完整“包類”名稱
Java反射機制提供的功能:
(1)在運行時判斷任意一個對象所屬的類
(2)在運行時構造任意一個類的對象
(3)在運行時判斷任意一個類所具有的成員變量和方法
(4)在運行時獲取泛型信息
(5)在運行時調用任意一個對象的成員變量和方法
(6)在運行時處理註解
(7)生成動態代理
反射相關的主要API:
(1)java.lang.Class: 代表一個類
(2)java.lang.reflect.Method: 代表類的方法
(3)java.lang.reflect.Field: 代表類的成員變量
(4)java.lang.reflect.Constructor: 代表類的構造器
(5)......
Person實體類:
public class Person { private String name; public int age; private Person() { } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } public Person(String name, int age) { this.name = name; this.age = age; } private Person(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void show() { System.out.print("你好,我是一個程序員"); } private String showNation(String name) { System.out.print("我的國際是:" + name); return name; } }
MainApplication.java文件
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class MainApplication { /** * 主程序入口 */ public static void main(String[] args) { before(); after(); } /** * 反射之前:對Person的操作 */ public static void before() { //1.創建Person類的對象 Person p1 = new Person("小米", 12); //2.通過對象,調用裏面的屬性、方法 p1.age = 18; System.out.println(p1.toString()); p1.show(); //在Person類外部,不可通過Person類對象調用私有結構 //比如:private showNation() } /** * 反射之後:對Person的操作 */ public static void after() { //Class反射源頭 Class clazz = Person.class; try { //1.通過反射創建Person類對象,得到指定構造器 Constructor cons = clazz.getConstructor(String.class, int.class); Object obj = cons.newInstance("Tom", 24); Person p = (Person) obj; System.out.println(p.toString()); //2.通過反射,調用對象指定的屬性、方法 //調用屬性 Field age = clazz.getDeclaredField("age"); age.set(p, 10); System.out.println(p.toString()); //調用方法 Method method = clazz.getDeclaredMethod("show"); method.invoke(p); //通過反射,可以調用Person類的私有結構。比如:私有構造器、屬性、方法 //調用私有的構造器 Constructor dcons = clazz.getDeclaredConstructor(String.class); dcons.setAccessible(true); Person p1 = (Person) dcons.newInstance("leict"); System.out.println(p1); //調用私有屬性 Field n1 = clazz.getDeclaredField("name"); n1.setAccessible(true); n1.set(p1, "黃繼光"); System.out.println(p1.toString()); //調用私有方法 Method showNation = clazz.getDeclaredMethod("showNation", String.class); showNation.setAccessible(true); String nation = (String) showNation.invoke(p1, "中國"); System.out.println("\n\r" + nation + "\n\r"); System.out.println("getName---->>>>" + clazz.getName()); System.out.println("getSimpleName---->>>>" + clazz.getSimpleName()); System.out.println("getCanonicalName---->>>>" + clazz.getCanonicalName()); } catch (Exception e) { e.printStackTrace(); } } }
效果如下: