反射機制
JAVA反射機制是在運行狀態(tài)中育拨,對于任意一個類礁扮,都能夠知道這個類的所有屬性和方法尺上;對于任意一個對象仿荆,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制鲤桥。
在android中Google很多的類的某些方法不讓第三方應(yīng)用去調(diào)用揍拆,通過java反射機制能把這些隱藏方法獲取出來并調(diào)用
1.實例化Class對象,有三種方式茶凳,
Class.forName(類名全路徑); //通過Class的靜態(tài)方法
對象.getClass() //通過對象.getClass方法
int.class //基本數(shù)據(jù)類型及基本數(shù)據(jù)類型的封裝了嫂拴,例如Integer
2.獲取父類
Class<?> clazz = Class.forName(類名全路徑); //通過Class的靜態(tài)方法
Class<?> superclass = clazz.getSuperclass();
3.獲取實現(xiàn)接口
Class<?> clazz = Class.forName(類名全路徑); //通過Class的靜態(tài)方法
Class<?>[] interfaces = clazz.getInterfaces()
4.獲取指定參數(shù)構(gòu)造函數(shù)及實例化
Class<?> clazz = Class.forName(類名全路徑); //通過Class的靜態(tài)方法
Constructor<?> constructor = clazz.getConstructor(Class<?> ... class);//獲取公共的
Constructor<?> constructor = clazz.getDeclaredConstructor()//獲取私有的
constructor.newInstance(Object args);
5.獲取所有構(gòu)造函數(shù)及構(gòu)造參數(shù)的類型
Class<?> clazz = Class.forName(類名全路徑); //通過Class的靜態(tài)方法
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的靜態(tài)方法
class.newInstance();
7.獲取字段,修改字段
Class<?> clazz = Class.forName(類名全路徑); //通過Class的靜態(tài)方法
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);//設(shè)置java取消訪問檢查贮喧,也就是說如果是私有的也可以訪問,
field.set(obj, "Java反射機制");
8.獲取方法,運行方法
Class<?> clazz = Class.forName(類名全路徑); //通過Class的靜態(tài)方法
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)//設(shè)置java取消訪問檢查筒狠,也就是說如果是私有的也可以訪問,
method.invoke(clazz.newInstance(), 20, "張三");
9.獲取數(shù)組或者list中的類型,如果不是數(shù)組或集合返回null
Class<?> clazz = Class.forName(類名全路徑); //通過Class的靜態(tài)方法
Class<?> componentType = clazz.getComponentType();
————————————————
版權(quán)聲明:本文為CSDN博主「劉鎵旗」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議箱沦,轉(zhuǎn)載請附上原文出處鏈接及本聲明窟蓝。
原文鏈接:https://blog.csdn.net/yulong0809/article/details/56842027