摘要:反射機制是什么反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為語言的反射機制反射機制能做什么反射機制主要提供了以下功
反射機制是什么
反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制
反射機制能做什么反射機制主要提供了以下功能:
在運行時判斷任意一個對象所屬的類
在運行時構(gòu)造任意一個類的對象
在運行時判斷任意一個類所具有的成員變量和方法
在運行時調(diào)用任意一個對象的方法
生成動態(tài)代理
反射機制的相關(guān)API 通過一個對象獲得完整的包名和類名@Test public void getReflectionName() { String str = new String(); System.out.println(str.getClass().getName()); // java.lang.String System.out.println(str.getClass().getSimpleName()); // String }實例化Class類對象(三種方式)
@Test public void getInitClazz() { try { // 方式一: Class> clazz_1 = Class.forName("java.lang.String"); // 方式二: Class> clazz_2 = new String().getClass(); // 方式三: Class> clazz_3 = String.class; } catch (Exception e) { e.printStackTrace(); } }獲取一個對象的父類與實現(xiàn)的接口
@Test public void getParentAndIntefaces() { try { Class> clazz = Class.forName("java.lang.String"); // 取得父類 Class> parentClass = clazz.getSuperclass(); System.out.println("clazz的父類為:" + parentClass.getName());// clazz的父類為: java.lang.Object // 獲取所有的接口 Class> intes[] = clazz.getInterfaces(); System.out.println("clazz實現(xiàn)的接口有:"); for (int i = 0; i < intes.length; i++) { System.out.println((i + 1) + ":" + intes[i].getName()); } } catch (Exception e) { e.printStackTrace(); } }通過反射獲取屬性
@Test public void getFieldsByReflect() { try { Class> clazz = String.class ; // 取得本類的全部屬性 Field[] declaredFields = clazz.getDeclaredFields(); // 取得實現(xiàn)的接口或者父類的屬性 Field[] fields = clazz.getFields(); //遍歷本類屬性 for (Field field : declaredFields) { // 權(quán)限修飾符 int mo = field.getModifiers(); String priv = Modifier.toString(mo); // 屬性類型 Class> type = field.getType(); System.out.println(priv + " " + type.getName() + " " + field.getName() + ";"); } } catch (Exception e) { e.printStackTrace(); } }通過反射獲取方法函數(shù)
@Test public void getMethodsByReflect() { try { Class> clazz = String.class ; // 類的所有公用(public)方法包括其繼承類的公用方法,當(dāng)然也包括它所實現(xiàn)接口的方法 Method[] methods = clazz.getMethods(); // 類或接口聲明的所有方法,包括公共、保護(hù)、默認(rèn)(包)訪問和私有方法,但不包括繼承的方法。當(dāng)然也包括它所實現(xiàn)接口的方法 Method[] declaredMethods = clazz.getDeclaredMethods(); //遍歷本類屬性 for (Method method : methods) { // 權(quán)限修飾符 int mo = method.getModifiers(); String priv = Modifier.toString(mo); //返回值 Class> returnType = method.getReturnType(); //方法名 String methodName = method.getName(); //方法參數(shù)類型 Class>[] parameterTypes = method.getParameterTypes(); //拋出的異常 Class>[] exceptionTypes = method.getExceptionTypes(); } } catch (Exception e) { e.printStackTrace(); } }通過反射獲取構(gòu)造方法
@Test public void getConstructorsByReflect() { try { Class> clazz = Class.forName("java.lang.String"); //獲取構(gòu)造方法 Constructor>[] constructors = clazz.getConstructors(); for (Constructor constructor : constructors) { //獲取構(gòu)造方法的參數(shù) Class[] parameterTypes = constructor.getParameterTypes(); for (Class clazzType : parameterTypes) { System.out.print(clazzType.getSimpleName() + " "); } System.out.println(); } } catch (Exception e) { e.printStackTrace(); } }通過反射機制設(shè)置屬性
@Test public void oprFieldsByReflect() { try { Class> clazz = Class.forName("java.lang.String"); //實例化對象 String str = new String("String"); //可以直接對 private 的屬性賦值 Field field = clazz.getDeclaredField("hash"); //改變屬性 field.setAccessible(true); //調(diào)用映射屬性 field.set(str, 0); System.out.println(field.get(str)); } catch (Exception e) { e.printStackTrace(); } }通過反射機制調(diào)用方法
@Test public void oprMethodsByReflect() { try { Class> clazz = Class.forName("java.lang.String"); //實例化一個對象 String str = new String("String"); //反射出一個方法 Method method = clazz.getMethod("startsWith", String.class); //調(diào)用映射方法 Object result = method.invoke(str, "Str"); System.out.println(result); } catch (Exception e) { e.printStackTrace(); } }實例應(yīng)用 在泛型為Integer的ArrayList中存放一個String類型的對象
/** * 在泛型為Integer的ArrayList中存放一個String類型的對象 * @throws Exception */ @Test public void test() throws Exception { ArrayList通過反射取得并修改數(shù)組的信息list = new ArrayList (); Method method = list.getClass().getMethod("add", Object.class); method.invoke(list, "Java反射機制實例"); System.out.println(list.get(0)); }
/** * 通過反射取得并修改數(shù)組的信息 * * @throws Exception */ @Test public void test() throws Exception { int[] temp = { 1, 2, 3, 4, 5 }; Class> demo = temp.getClass().getComponentType(); System.out.println("數(shù)組類型: " + demo.getName()); System.out.println("數(shù)組長度 " + Array.getLength(temp)); System.out.println("數(shù)組的第一個元素: " + Array.get(temp, 0)); Array.set(temp, 0, 100); System.out.println("修改之后數(shù)組第一個元素為: " + Array.get(temp, 0)); }通過反射機制修改數(shù)組的大小
/** * 通過反射機制修改數(shù)組的大小 * * @throws Exception */ @Test public void test() throws Exception { int[] temp = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int[] newTemp = (int[]) arrayInc(temp, 15); print(newTemp); String[] atr = { "a", "b", "c" }; String[] str1 = (String[]) arrayInc(atr, 8); print(str1); } // 修改數(shù)組大小 private static Object arrayInc(Object obj, int len) { Class> arr = obj.getClass().getComponentType(); Object newArr = Array.newInstance(arr, len); int co = Array.getLength(obj); System.arraycopy(obj, 0, newArr, 0, co); return newArr; } // 打印 private static void print(Object obj) { Class> c = obj.getClass(); if (!c.isArray()) { return; } System.out.println("數(shù)組長度為: " + Array.getLength(obj)); for (int i = 0; i < Array.getLength(obj); i++) { System.out.print(Array.get(obj, i) + " "); } System.out.println(); }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67320.html
近期在維護(hù)公司項目的時候遇到一個問題,因為實體類中的 set 方法涉及到了業(yè)務(wù)邏輯,因此在給對象賦值的過程中不能夠使用 set 方法,為了實現(xiàn)功能,所以采用了反射的機制給對象屬性賦值,借此機會也了解了反射的一些具體用法和使用場景,分以下兩點對反射進(jìn)行分析: 反射的優(yōu)勢和劣勢 反射的應(yīng)用場景 反射的優(yōu)勢和劣勢 ??個人理解,反射機制實際上就是上帝模式,如果說方法的調(diào)用是 Java 正確的打開方式...
摘要:的動態(tài)性反射機制動態(tài)編譯動態(tài)執(zhí)行代碼動態(tài)字節(jié)碼操作動態(tài)語言程序運行時可以改變程序得結(jié)構(gòu)或變量類型典型語言等如下代碼不是動態(tài)語言但有一定的動態(tài)性我們可以利用反射機制字節(jié)碼操作獲得類似動態(tài)語言的特性的動態(tài)性讓編程的時候更加靈活反射機制反射機制指 1.Java的動態(tài)性 反射機制 動態(tài)編譯 動態(tài)執(zhí)行JavaScript代碼 動態(tài)字節(jié)碼操作 2.動態(tài)語言 程序運行時,可以改變程序得結(jié)構(gòu)或變量...
摘要:效率運行效率使用反射減低程序的運行效率。開發(fā)效率由于反射運用到各個框架中,大大加快了開發(fā)的效率。 反射的核心就是Class對象,每一個類被jvm加載都會有一個對應(yīng)的class對象,這個class對象包含了這個類的結(jié)構(gòu)信息,反射就是會通過反射api反復(fù)操作這個class對象(屬性,方法,注解,構(gòu)造器,泛型),但是反射會降低程序的運行效率,比普通方法要慢30倍,通過setAccessble...
摘要:筆記來源反射綜述類的使用方法的反射成員變量的反射構(gòu)造函數(shù)的反射類加載機制類的使用在面向?qū)ο蟮氖澜缋铮f事萬物皆對象。 筆記來源:IMOOC 反射 Java Reflect 綜述 Class類的使用 方法的反射 成員變量的反射 構(gòu)造函數(shù)的反射 類加載機制 Class 類的使用 在面向?qū)ο蟮氖澜缋铮f事萬物皆對象。 但在Java里面有兩樣?xùn)|西不是對象:靜態(tài)的成員、普通數(shù)據(jù)類型類...
閱讀 2740·2023-04-25 22:15
閱讀 1813·2021-11-19 09:40
閱讀 2158·2021-09-30 09:48
閱讀 3231·2021-09-03 10:36
閱讀 2033·2021-08-30 09:48
閱讀 1863·2021-08-24 10:00
閱讀 2735·2019-08-30 15:54
閱讀 710·2019-08-30 15:54