反射機制相關的API方法,反射機制api
JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態擷取的資訊以及動態調用對象的方法的功能稱為java語言的反射機制。
在android中Google很多的類的某些方法不讓第三方應用去調用,通過java反射機制能把這些隱藏方法擷取出來並調用
相關的API
1.執行個體化Class對象,有三種方式, Class.forName(類名全路徑); //通過Class的靜態方法 對象.getClass() //通過對象.getClass方法 int.class //基礎資料型別 (Elementary Data Type)及基礎資料型別 (Elementary Data Type)的封裝了,例如Integer 2.擷取父類 Class<?> clazz = Class.forName(類名全路徑); //通過Class的靜態方法 Class<?> superclass = clazz.getSuperclass(); 3.擷取實現介面 Class<?> clazz = Class.forName(類名全路徑); //通過Class的靜態方法 Class<?>[] interfaces = clazz.getInterfaces() 4.擷取指定參數建構函式及執行個體化 Class<?> clazz = Class.forName(類名全路徑); //通過Class的靜態方法 Constructor<?> constructor = clazz.getConstructor(Class<?> ... class);//擷取公用的 Constructor<?> constructor = clazz.getDeclaredConstructor()//擷取私人的 constructor.newInstance(Object args); 5.擷取所有建構函式及構造參數的類型 Class<?> clazz = Class.forName(類名全路徑); //通過Class的靜態方法 Constructor<?>[] constructors = clazz.getConstructors();//公用的 Constructor<?>[] constructors = clazz.getDeclaredConstructors()//包括私人的 for (int i = 0; i < constructors.length; i++) { Class<?> clazzs[] = constructors[i].getParameterTypes();//擷取類型 System.out.print("constructors[" + i + "] ("); for (int j = 0; j < clazzs.length; j++) { if (j == clazzs.length - 1) System.out.print(clazzs[j].getName()); else System.out.print(clazzs[j].getName() + ","); } System.out.println(")"); } 6.通過無參執行個體化對象 Class<?> clazz = Class.forName(類名全路徑); //通過Class的靜態方法 class.newInstance(); 7.擷取欄位,修改欄位 Class<?> clazz = Class.forName(類名全路徑); //通過Class的靜態方法 Field field = clazz.getField(String name);//擷取公用欄位 Field field = clazz.getDeclaredField(String name);//擷取私人公用欄位 Field[] field = clazz.getFields();//擷取所有公用欄位 Field[] field = clazz.getDeclaredFields();//擷取包括私人所有欄位 Field field = clazz.getDeclaredField("heihei"); field.setAccessible(true);//設定java取消訪問檢查,也就是說如果是私人的也可以訪問, field.set(obj, "Java反射機制"); 8.擷取方法,運行方法 Class<?> clazz = Class.forName(類名全路徑); //通過Class的靜態方法 clazz.getMethod(String name ,Class<?> ... parame);//擷取公用指定方法 clazz.getDeclaredMethod(String name ,Class<?> ... parame)//擷取私人指定方法 clazz.getMethods()//擷取公用所有方法 clazz.getDeclaredMethods();//擷取包括私人全部方法 Method method = clazz.getMethod("add"); method.invoke(clazz.newInstance()); method = clazz.getMethod("getInfo", int.class, String.class); method.setAccessible(true)//設定java取消訪問檢查,也就是說如果是私人的也可以訪問, method.invoke(clazz.newInstance(), 20, "張三"); 9.擷取數組或者list中的類型,如果不是數組或集合返回null Class<?> clazz = Class.forName(類名全路徑); //通過Class的靜態方法 Class<?> componentType = clazz.getComponentType();