Java反射大法

  • 反射获取类方法并调用
  • 反射获取类字段并修改
  • 技巧
    • 反射获取类字段
    • 反射获取方法
  • 获取私有函数

反射获取类方法并调用

反射:在执行innerFunc函数之前获取reflect字段的值,并且调用ref1函数

反射获取类字段并修改

技巧

反射获取类字段

四种方法(clazz为类的字节码

  • 获取公有字段

    • getField:获取类的字段
    • getFields:获取当前类的所有字段:返回数组
  • 获取私有字段

    不管什么类型都可以

    • getDeclaredField:获取类的字段
    • getDeclaredFields:获取当前类的所有字段:返回数组

反射获取方法

四种方法(clazz为类的字节码

  • 获取公有方法

    • getMethod:获取公有函数
    • getMethods:获取所有公有函数
  • 获取私有函数

    不管什么类型都可以

    • getDeclaredMethod:获取所有类型函数
    • getDeclaredMethods:获取所有类型函数搜索函数
//10、反射:在执行innerFunc函数之前获取reflect字段的值,并且11、调用ref1函数XposedHelpers.findAndHookMethod(XposedHelpers.findClass("com.xiaojianbang.xposeddemo.Demo$InnerClass", lpparam.classLoader),"innerFunc",String.class,new XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {//反射获取字段:     @获取类的字段Field reffield = clazz.getDeclaredField("reflect");//如果是private私有字段需要设置为truereffield.setAccessible(true);//reffield.get里面需要一个对象//实例化:com.xiaojianbang.xposeddemo.Demo InnerClassObject 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私有方法需要设置为truerefmethod.setAccessible(true);//调用:invoke,这里调用了三次refmethod.invoke(obj);refmethod.invoke(obj);refmethod.invoke(obj);}
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.XC_MethodHook;
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() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {//反射获取字段:     @获取类的字段Field reffield = clazz.getDeclaredField("reflect");//如果是private私有字段需要设置为truereffield.setAccessible(true);//reffield.get里面需要一个对象//实例化:com.xiaojianbang.xposeddemo.Demo InnerClassObject 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私有方法需要设置为truerefmethod.setAccessible(true);//调用:invoke,这里调用了三次refmethod.invoke(obj);refmethod.invoke(obj);refmethod.invoke(obj);}});}}}

Xposed Java反射大法相关推荐

  1. Java 反射 (快速了解反射)

    反射的概念 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java ...

  2. java反射最佳实践,java反射性能测试分析

    java反射性能测试分析 java有别于其他编程语言而让我着迷的特性有很多,其中最喜欢的是接口设计,他让我们设计的东西具有美感.同样反射也是我比较喜欢的一个特性,他让程序自动运行,动态加载成为了可能, ...

  3. java 获取 反射 方法 名_乐字节Java反射之一:反射概念与获取反射源头Class

    一.Java反射机制概念 "程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言",如Python, Ruby是动态语言:显然C++,Java,C#不是动态语言,但是JAV ...

  4. Java反射以及应用

    需求:需要通过反射动态获取类的字段类型,然后做特殊处理 Java反射getDeclaredField和getField的区别 getDeclaredFiled 只能获取类本身的属性成员(包括私有.共有 ...

  5. java反射用在哪里_Java反射

    昨天去参加比赛了,所以没有进行博客迁移.人生中的第一场健体比赛,虽然没得奖,但是收获和带来的思考颇丰.意外地进入了男子B组(174以上)的半决赛,然后在半决赛的时候还被裁判员点名出去单独比较,这个很让 ...

  6. Java反射(详述版)

    一.什么是反射? 我们先来看一个例子: package venus; public class Student {public String name;public Student(){System. ...

  7. java 反射 动态代理

    在上一篇文章中介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大 ...

  8. Java反射 - 私有字段和方法

    尽管普遍认为通过Java Reflection可以访问其他类的私有字段和方法. 这并不困难. 这在单元测试中可以非常方便. 本文将告诉你如何. 访问私有字段 要访问私有字段,您需要调用Class.ge ...

  9. 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换

    作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...

最新文章

  1. crypto安装_KubeEdge 完整安装 amp; 部署小指南
  2. 使用axis2进行WebService的开发
  3. 判断是否是微信浏览器JavaScript代码
  4. Java基础学习总结(32)——Java项目命名规范
  5. qpython3h手机版怎么发短信_python如何使用腾讯云发送短信
  6. 20220521 将plecs输出的电路图转换为黑线白底
  7. 荣耀盒子无线网连接不上电脑连接服务器,华为荣耀盒子无法连接有线网络怎么解决...
  8. FLStudio21无需切换中文语言fl下载中文免费版
  9. 洪水填充算法_计算机图形:洪水填充算法
  10. 3.2 电信数据清洗
  11. 思科防火墙应用NAT
  12. php+chmod+r,从今往后,谁再告诉你Linux上chmod -R 777解决权限,果断绝交
  13. C++ 类(静态成员和静态函数)
  14. 【华为机试真题 C++】一种字符串压缩表示的解压-100
  15. 什么是5G?它能为我们带来什么样的便利?思维导图《5G时代》给你新认识
  16. Windows下桌面便签小工具--StickyPad简单使用教程(非StickyNotes)
  17. 揭开“QUIC”的神秘面纱
  18. 大学行政职务、各类学生以及教师职称的英文翻译
  19. 《疯狂动物城》水彩画
  20. Cows and Cars

热门文章

  1. RPA+ERP+流程挖掘 加速推动企业超自动化进程 | 艺赛旗RPA产品总监李梦奇
  2. 【腾讯Bugly干货分享】Android 插件技术实战总结
  3. CuteOne搭建个人云盘最全教学!
  4. 1146:判断字符串是否为回文
  5. 突然想写写自己的伞。
  6. ABBYY FineReader2023最新版本OCR文字识别软件PDF
  7. 两端同时写命名管道的测试程序
  8. kafka的基本命令和api
  9. 《团队-排课软件-测试过程》
  10. Web实现:装饰鼠标箭头