Xposed使用技巧-反射
反射遍历所有方法和字段

打印所有方法信息,不打印方法体
//12、反射获取当前类下所有方法信息并打印 @类的字节码
for (Method method : clazz.getDeclaredMethods()) {
Log.i("52Hz", "Method:" + method.toString());
}
//13、反射获取当前类所有字段 @类字节码
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Log.i("52Hz", "Field:" + method.toString());
}
package com.hz52.xposeddalvik;
/**
* @Program: XposedDalvik
* @Description:
* @Author: 52Hz
* @CreationTime: 2021年11月09日 17:21 星期二
**/
import android.util.Log;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
public class Demo implements IXposedHookLoadPackage {
public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
Log.d("52Hz", "hooking...");
//-1、需要hook的apk(包名)
if (lpparam.packageName.equals("com.xiaojianbang.xposeddemo")) {
//0、需要hook的类
final Class clazz = XposedHelpers.findClass("com.xiaojianbang.xposeddemo.Demo", lpparam.classLoader);
//1、修改变量: @类的字节码 @变量名 @变量值
// XposedHelpers.setStaticIntField(clazz, "staticInt", 100);
// XposedHelpers.setStaticObjectField(clazz, "tage", "52Hz");
//2、普通方法:@类的字节码 @方法名 @方法参数类型字节码,指明(因为存在重载,不同参数,不同方法)@回调函数
// XposedHelpers.findAndHookMethod(
// clazz, //hook的类的字节码
// "publicFunc", //hook方法名称
// String.class, //hook方法的传入参数类型字节码类型,可扩增
// new XC_MethodHook() { //回调函数(方法)
//
// //Hook方法执行之前操作
// @Override
// protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
// Log.d("52Hz", "publicFunc is hooked before");
//
// //获取传入参数:param.args是一个列表,获取第一个则param.args[0]
// Log.d("52Hz", "传入参数:" + param.args[0]);
//
// }
//
// //Hook方法执行之后操作
// @Override
// protected void afterHookedMethod(MethodHookParam param) throws Throwable {
// Log.d("52Hz", "publicFunc is hooked after");
//
// //获取返回值:param.getResult()
// Log.d("52Hz", "传出参数:" + param.getResult());
//
// }
//
//
// });
//3.1、无参构造函数 @回调函数(因为不存在返回值,所以只beforeHookedMethod)
// XposedHelpers.findAndHookConstructor(clazz, new XC_MethodHook() {
// //Hook构造函数执行之前操作
// @Override
// protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
// //获取传入参数:param.args是一个列表,获取第一个则param.args[0]
// Log.d("52Hz", "构造函数参数:" + param.args[0]);
// }
// });
//3.2、有参构造函数 @参数类型字节码 @参数类型 @回调函数
// XposedHelpers.findAndHookConstructor(
// clazz,
// String.class,
// new XC_MethodHook() {
//
// //Hook有参构造函数执行之前操作
// @Override
// protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
// Log.d("52Hz", "Constructor is hooked before");
//
// //获取传入参数:param.args是一个列表,获取第一个则param.args[0]
// Log.d("52Hz", "构造函数传入参数:" + param.args[0]);
//
// }
//
// //Hook有参构造函数执行之后操作
// @Override
// protected void afterHookedMethod(MethodHookParam param) throws Throwable {
// Log.d("52Hz", "Constructor is hooked after");
//
// //获取返回值:param.getResult()
// Log.d("52Hz", "构造函数传出参数:" + param.getResult());
//
// }
//
// });
//5、Hook复杂方法:@方法名 @参数类型字节码 @回调函数
// String str, String[][] strArr, Map<String,String>, ArrayList arrayList
// String.class String[][].class Map.class ArrayList.class
// XposedHelpers.findAndHookMethod(
// clazz,
// "complexParameterFunc",
// //参数-start
// String.class, //java.lang.String
// String[][].class, //[[Ljava.lang.String
// Map.class, //Map.class
// ArrayList.class, //Class.forName("java.util.ArrayList")
// //参数-end
// new XC_MethodHook() {
// @Override
// protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
// super.beforeHookedMethod(param);
// }
//
// @Override
// protected void afterHookedMethod(MethodHookParam param) throws Throwable {
// super.afterHookedMethod(param);
// }
// });
//6、需要hook的自定义类
//final Class cls = XposedHelpers.findClass("com.xiaojianbang.xposeddemo.Animal",lpparam.classLoader);
// final Class cls = Class.forName("com.xiaojianbang.xposeddemo.Animal",false,lpparam.classLoader);
//6、 @hook类的字节码文件 @hook的方法 @方法参数1:hook自定义类的字节码文件 @方法参数2:
// XposedHelpers.findAndHookMethod(
// clazz,
// "Inner",
// cls, //com.xiaojianbang.xposeddemo.Animal
// String.class,
// new XC_MethodHook() {
// @Override
// protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
// super.beforeHookedMethod(param);
// }
//
// @Override
// protected void afterHookedMethod(MethodHookParam param) throws Throwable {
// super.afterHookedMethod(param);
// }
// }
// );
//7、替换函数 @类的字节码文件 @hook的方法名 @使用replace替换原方法
// XposedHelpers.findAndHookMethod(
// clazz,
// "replaceFunc",
// new XC_MethodReplacement() {
// @Override
// protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
// Log.i("52Hz", "替换后的输出");
// return null;
// }
// }
// );
//8、hook内部类 @hook的内部类:包名+类名+$+类名 @匿名类方法 @匿名类方法参数字节码
// XposedHelpers.findAndHookMethod(
// XposedHelpers.findClass("com.xiaojianbang.xposeddemo.Demo$InnerClass", lpparam.classLoader),
// "innerFunc",
// String.class,
// new XC_MethodHook() {
//
//
// @Override
// protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
//
// Log.i("52Hz", "Xposed主动调用前");
// //9、xposed主动调用#方法:@不是静态方法需要先实例化大类.newInstance() @方法名
// XposedHelpers.callMethod(
// clazz.newInstance(), //外面大类进行实例化:大类.newInstance()
// "refl"
// // new Object[0] //参数列表没有去除
// );
// Log.i("52Hz", "Xposed主动调用后");
//
//
// //param.thisObject获取当前所属的对象
// int cc = XposedHelpers.getIntField(param.thisObject, "innerPublicInt");
// Log.i("52Hz", " " + cc);
//
// }
//
// }
//
// );
//10、反射:在执行innerFunc函数之前获取reflect字段的值,并且11、调用ref1函数
// XposedHelpers.findAndHookMethod(
// XposedHelpers.findClass("com.xiaojianbang.xposeddemo.Demo$InnerClass", lpparam.classLoader),
// "innerFunc",
// String.class,
// new XC_MethodHook() {
// @Override
// protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
//
// //反射获取字段: @获取类的字段
// Field reffield = clazz.getDeclaredField("reflect");
// //如果是private私有字段需要设置为true
// reffield.setAccessible(true);
//
// //reffield.get里面需要一个对象
// //实例化:com.xiaojianbang.xposeddemo.Demo InnerClass
// Object obj = clazz.newInstance();
//
// //获取修改前字段值
// String str = (String) reffield.get(obj);
// Log.i("52Hz", "这是反射获取的字段:" + str);
//
// //修改字段值
// reffield.set(obj, "famshedafa");
//
// //获取修改后字段值
// String str2 = (String) reffield.get(obj);
// Log.i("52Hz", "这是反射设置的字段:" + str2);
//
//
// //11、找方法
// Method refmethod = clazz.getDeclaredMethod("ref1");
// //如果是private私有方法需要设置为true
// refmethod.setAccessible(true);
//
// //调用:invoke,这里调用了三次
// refmethod.invoke(obj);
// refmethod.invoke(obj);
// refmethod.invoke(obj);
// }
// });
//12、反射获取当前类下所有方法信息并打印 @类的字节码
for (Method method : clazz.getDeclaredMethods()) {
Log.i("52Hz", "Method:" + method.toString());
}
//13、反射获取当前类所有字段
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Log.i("52Hz", "Field:" + method.toString());
}
}
}
}
反射遍历所有内部类
//14、反射获取所有内部类 @类的字节码
Class[] cls = clazz.getDeclaredClasses();
for (int i = 0; i < cls.length; i++) {
//打印内部类名称
Log.i("52Hz", "内部类:" + cls[i].getName());
//打印内部类所有字段
for (Field field : cls[i].getDeclaredFields()) {
Log.i("52Hz", "内部类字段:" + field.toString());
}
//打印内部类所有方法
for (Method method : cls[i].getDeclaredMethods()) {
Log.i("52Hz", "内部类方法:" + method.toString());
}
}
本文介绍了如何使用Java反射API遍历并打印类的所有方法和字段信息,同时探讨了反射在遍历内部类时的应用。

1万+

被折叠的 条评论
为什么被折叠?



