还有很多其它方法,本文只是几个简单的例子
反射某个对象obj的成员变量
Class<?> sessionParamsClass = obj.getClass();
Field appPackageNameField = sessionParamsClass.getDeclaredField("fieldName");
appPackageNameField.setAccessible(true);
String appPackageName = (String) appPackageNameField.get(obj);(静态字段可以field.get(null))
反射获取某个对象所有Uri类型的成员变量值
PackageInstaller.SessionParams sessionParams = (PackageInstaller.SessionParams) param.args[0];
Class<?> sessionParamsClass = sessionParams.getClass();
Log.e("packageHook",sessionParamsClass.getName());
Field[] declaredFields = sessionParamsClass.getDeclaredFields();
for (Field field : declaredFields){
field.setAccessible(true);
if (field.getType() == Uri.class){
Uri uri = (Uri) field.get(sessionParams);
if (uri != null){
if (uri.getPath() != null){
Log.e("packageHook",field.getName() + "_path_" + uri.getPath());
}
}else {
Log.e("packageHook","Uri null");
}
}
}
反射构造一个类的对象
private Object getPackageManagerException(ClassLoader classloader) throws Exception {
Class<?> pme = Class.forName(PACKAGE_MANAGER_Exception_CLASS, false, classLoader);
// 首先准备一个Class[]做为ctor的参数类型(本例指定为一个int和一个string),
Class[] pType = new Class[] {int.class, String.class};
// 调用pType为变量的getConstructor(),获得一个专属ctor
Constructor ctor = pme.getDeclaredConstructor(pType);
// 准备一个Object[] 做为ctor实参值
Object[] obj = new Object[]{INSTALL_FAILED_INTERNAL_ERROR, "can not install"};
// 调用上述专属ctor的newInstance()
Object result = ctor.newInstance(obj);
return result;
}
反射执行方法
/**
* 执行方法
* @param obj 执行方法的对象
* @param methodName 方法名称
* @param classes 执行方法的参数类型
* @param args 执行方法的参数
*/
public void invokeMethod(Object obj, String methodName, Class[] classes, Object... args){
try {
Method method;
if (classes != null && classes.length > 0){
method = obj.getClass().getDeclaredMethod(methodName,classes);
}else {
method = obj.getClass().getDeclaredMethod(methodName);
}
method.setAccessible(true);
method.invoke(obj, args);//反射执行静态方法method.invoke(null, args)只需要将invoke方法的第一个参数设为null即可!
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
(备注)classtype:boolean.class / int.class / List.class /
反射更改变量的值
Field[] fields = obj.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
Log.e("aaaa",fields[i].getName());
if (fields[i].getName().equals("codeFile")) {
fields[i].set(obj, new File("i don't want to install"));
}
}
错误不足之处或相关建议欢迎大家评论指出,谢谢!如果觉得内容可以的话麻烦喜欢(♥)一下
网友评论