Xposed Java反射大法
Java反射大法
- 反射获取类方法并调用
- 反射获取类字段并修改
- 技巧
- 反射获取类字段
- 反射获取方法
- 获取私有函数
反射获取类方法并调用
反射:在执行innerFunc函数之前获取reflect字段的值,并且调用ref1函数
反射获取类字段并修改
技巧
反射获取类字段
四种方法(clazz为类的字节码
)
获取公有字段:
- getField:
获取类的字段
- getFields:
获取当前类的所有字段:返回数组
- getField:
获取私有字段:
不管什么类型都可以
- getDeclaredField:
获取类的字段
- getDeclaredFields:
获取当前类的所有字段:返回数组
- getDeclaredField:
反射获取方法
四种方法(clazz为类的字节码
)
获取公有方法:
- getMethod:
获取公有函数
- getMethods:
获取所有公有函数
- getMethod:
获取私有函数
不管什么类型都可以
- 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反射大法相关推荐
- Java 反射 (快速了解反射)
反射的概念 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java ...
- java反射最佳实践,java反射性能测试分析
java反射性能测试分析 java有别于其他编程语言而让我着迷的特性有很多,其中最喜欢的是接口设计,他让我们设计的东西具有美感.同样反射也是我比较喜欢的一个特性,他让程序自动运行,动态加载成为了可能, ...
- java 获取 反射 方法 名_乐字节Java反射之一:反射概念与获取反射源头Class
一.Java反射机制概念 "程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言",如Python, Ruby是动态语言:显然C++,Java,C#不是动态语言,但是JAV ...
- Java反射以及应用
需求:需要通过反射动态获取类的字段类型,然后做特殊处理 Java反射getDeclaredField和getField的区别 getDeclaredFiled 只能获取类本身的属性成员(包括私有.共有 ...
- java反射用在哪里_Java反射
昨天去参加比赛了,所以没有进行博客迁移.人生中的第一场健体比赛,虽然没得奖,但是收获和带来的思考颇丰.意外地进入了男子B组(174以上)的半决赛,然后在半决赛的时候还被裁判员点名出去单独比较,这个很让 ...
- Java反射(详述版)
一.什么是反射? 我们先来看一个例子: package venus; public class Student {public String name;public Student(){System. ...
- java 反射 动态代理
在上一篇文章中介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大 ...
- Java反射 - 私有字段和方法
尽管普遍认为通过Java Reflection可以访问其他类的私有字段和方法. 这并不困难. 这在单元测试中可以非常方便. 本文将告诉你如何. 访问私有字段 要访问私有字段,您需要调用Class.ge ...
- 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...
最新文章
- crypto安装_KubeEdge 完整安装 amp; 部署小指南
- 使用axis2进行WebService的开发
- 判断是否是微信浏览器JavaScript代码
- Java基础学习总结(32)——Java项目命名规范
- qpython3h手机版怎么发短信_python如何使用腾讯云发送短信
- 20220521 将plecs输出的电路图转换为黑线白底
- 荣耀盒子无线网连接不上电脑连接服务器,华为荣耀盒子无法连接有线网络怎么解决...
- FLStudio21无需切换中文语言fl下载中文免费版
- 洪水填充算法_计算机图形:洪水填充算法
- 3.2 电信数据清洗
- 思科防火墙应用NAT
- php+chmod+r,从今往后,谁再告诉你Linux上chmod -R 777解决权限,果断绝交
- C++ 类(静态成员和静态函数)
- 【华为机试真题 C++】一种字符串压缩表示的解压-100
- 什么是5G?它能为我们带来什么样的便利?思维导图《5G时代》给你新认识
- Windows下桌面便签小工具--StickyPad简单使用教程(非StickyNotes)
- 揭开“QUIC”的神秘面纱
- 大学行政职务、各类学生以及教师职称的英文翻译
- 《疯狂动物城》水彩画
- Cows and Cars