Java反射是指在程序運行時,可以動態加載一個類,在程序運行期間動態獲取類的信息,并對類的成員和方法進行操作的能力。Java反射主要包括靜態反射和動態反射。
靜態反射是指在編譯期間就已將變量的類型確定,而且在程序運行期間不會發生變化,因此只需要在代碼中使用類的相關信息即可。使用靜態反射可以獲取類的構造器、方法、屬性等信息。
public class ReflectTest { public static void main(String[] args) throws Exception { // 獲取類對象 Class clazz = Class.forName("com.example.demo.User"); // 獲取構造器信息 Constructor[] constructors = clazz.getDeclaredConstructors(); for (Constructor c : constructors) { System.out.println(c); } // 獲取方法信息 Method[] methods = clazz.getMethods(); for (Method m : methods) { System.out.println(m); } // 獲取屬性信息 Field[] fields = clazz.getDeclaredFields(); for (Field f : fields) { System.out.println(f); } } }
動態反射是指在程序運行期間,可以根據用戶的需要來反射調用類的相關信息,可以通過新建實例、方法調用、獲取屬性值等動態執行代碼。使用動態反射需要使用到Class、Constructor、Method、Field等反射類。
public class ReflectTest { public static void main(String[] args) throws Exception { // 獲取類對象 Class clazz = Class.forName("com.example.demo.User"); // 獲取帶參構造器 Constructor constructor = clazz.getConstructor(String.class, Integer.class); // 新建實例 Object obj = constructor.newInstance("張三", 18); // 調用方法 Method method = clazz.getMethod("printInfo"); method.invoke(obj); // 獲取屬性值 Field field = clazz.getDeclaredField("name"); field.setAccessible(true); Object value = field.get(obj); System.out.println(value); } }
Java反射在實際開發中應用廣泛,常用于框架、ORM映射、AOP、類對象動態生成等場景。