一、简介:
Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并显示出来,然后使用部分没公开的函数。
二、查看类方法、成员
java.lang.Class类的方法
Constructor[]<?> getDeclaredConstructors();
Field[] getDeclaredFields();
Method[] getDeclaredMethods();
Constructor[]<?> getConstructors();
Field[] getDeclaredFields();
Method[] getDeclaredMethods();
带declared和不带declared的区别:
带declared的返回所有的成员方法(或成员变量)。 (即 publicprivate protect)
不带declared的只返回public的成员方法(或成员变量)。
显示运行时某类成员的代码
static public void printAllInform(Class<?> clsShow) {
try {
Log.i(TAG, "print " + clsShow.getClass().getName()
+ " all info -----------------------------------------\\");
// 取得所有方法
Method[] hideMethod = clsShow.getMethods();
int i = 0;
for (; i < hideMethod.length; i++) {
// Log.i("method name", hideMethod[i].getName());
printMethodInfo(hideMethod[i]);
}
// 取得所有常量
Field[] allFields = clsShow.getFields();
for (i = 0; i < allFields.length; i++) {
XLWirelessLog.i(TAG, allFields[i].getName());
}
} catch (Exception e) {
Log.e(TAG, "printAllInform error! " + e.toString() + ", "
+ e.getCause());
e.printStackTrace();
}
}
static public void printMethodInfo(Method method) {
StringBuilder sBuilder = new StringBuilder(method.getReturnType()
.getName());
sBuilder.append(" " + method.getName());
sBuilder.append('(');
Class<?>[] clazzParams = method.getParameterTypes();
for (Class<?> clazzParam : clazzParams) {
sBuilder.append(clazzParam.getName()).append(',');
}
if (clazzParams != null && clazzParams.length != 0)
sBuilder.deleteCharAt(sBuilder.length() - 1);
sBuilder.append(')');
Log.i(TAG, sBuilder.toString());
}
static public void printFieldInfo(Field field) {
StringBuilder sBuilder = new StringBuilder();
sBuilder.append(field.getType().getName());
sBuilder.append(" " + field.getName());
Log.i(TAG, sBuilder.toString());
}
获取类的Class类型
//[类名].class
printAllInform(WifiConfiguration.class);
//或 [变量]. getClass()
WifiConfiguration netConfig = new WifiConfiguration;
printAllInform(netConfig.getClass());
//或 使用Class.forName
Class laClass = Class.forName("android.net.LinkAddress");
三、使用类方法、成员
使用field
public static Object getDeclaredField(Object obj, String name)
throws SecurityException, NoSuchFieldException,
IllegalArgumentException, IllegalAccessException {
Field f = obj.getClass().getDeclaredField(name);
f.setAccessible(true);
Object out = f.get(obj);
f.setAccessible(false);
return out;
}
public static void setDeclaredField(Object obj, String name, Object value)
throws SecurityException, NoSuchFieldException,
IllegalArgumentException, IllegalAccessException {
Field f = obj.getClass().getDeclaredField(name);
f.setAccessible(true);
f.set(obj, value);
f.setAccessible(false);
}
使用Method
Method method = mWifiManager.getClass().getMethod(
"setWifiApEnabled", WifiConfiguration.class, Boolean.TYPE);
return (Boolean) method.invoke(mWifiManager, netConfig, enabled);
使用Constructor
Class laClass = Class.forName("android.net.LinkAddress");
Constructor laConstructor = laClass.getConstructor(new Class[] {
InetAddress.class, int.class });
Object linkAddress = laConstructor.newInstance(addr, prefixLength);