Xposed使用技巧-反射

本文介绍了如何使用Java反射API遍历并打印类的所有方法和字段信息,同时探讨了反射在遍历内部类时的应用。

反射遍历所有方法和字段

在这里插入图片描述

打印所有方法信息,不打印方法体

 //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());
                }

            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值