Java回调函数与什么是hook
Java回调函数Demo:
public class DemoT1 {
//控件监听回调 --简单版
public demoT1_ClickListener mDemoT1_clickListener;
public interface demoT1_ClickListener {
void T1Click();
}
public void setDemoT1_clickListener(demoT1_ClickListener demoT1_clickListener){
demoT1_clickListener = mDemoT1_clickListener;
}
/
/回调函数--demo版
private interface Response {
void onSuccess(String data);
void onFailed(String prompt);
}
private static String doSomething(){
try {
//......
react面试题hook是什么Thread.sleep(5000); //模拟耗时操作(如⽹络请求),操作正常返回"Success","Success"表⽰有效的数据
return "Success";
} catch (InterruptedException ex) {
//操作出现问题返回"Failed","Failed"包含错误提⽰,如错误码等
return "Failed";
}
}
// 使⽤回调函数操作
private static void callbackDoSomething(Response response){
try {
Thread.sleep(5000);
} catch (InterruptedException ex) {
}
}
public static void main(String[] args) {
//实例
DemoT1.callbackDoSomething(new Response() {
@Override
public void onSuccess(String data) {
}
@Override
public void onFailed(String prompt) {
}
});
}
}
HOOK:什么是hook?
hook (钩⼦) -->在java中它表⽰在事件到达终点前进⾏拦截或监控的⼀种⾏为. /**
*实现hook我们必须要知道java的反射和动态代理
*/
public class HookDemo {
/**
* 反射是java的查看、检测、修改⾃⾝的⼀种⾏为。
*在编译阶段,编译器将我们编写的java⽂件编译成.class⽂件。
* ⽽在运⾏期,jvm⼜将.class⽂件通过类加载器ClassLoader加载⼀个类对应的Class对象到内存当中。
* 通过修改Class对象,达到我们查看、检测、修改⾃⾝的⾏为。
*/
Class  mClass;
{
try {
/*
*  Constructor constructor = Constructor(); 拿到构造函数
*  DemoT1 t1 = (DemoT1) wInstance(DemoT1.class);获取新实例
*
* 同理,通过class类对象,可以获取对象的⽅法。动态代理中需要在⽅法拦截。
Methods  method[] = DeclaredMethods();
*
获取对象的域,
Field[] fields = DeclaredFields();
*
* */
mClass = Class.forName("application.demo1.DemoT1");
Constructor constructor = Constructor();
DemoT1 t1 = (DemoT1) wInstance(DemoT1.class);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
  拦截Android的button控件的监听-hook
public class MainActivity extends AppCompatActivity {
TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
mTextView = findViewById();
mTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("tww", "origin click");
}
});
hookOnClickListener(mTextView);
}
private void hookOnClickListener(View view) {
try {
// 得到 View 的 ListenerInfo 对象
Method getListenerInfo = DeclaredMethod("getListenerInfo");
getListenerInfo.setAccessible(true);
Object listenerInfo = getListenerInfo.invoke(view);
// 得到原始的 OnClickListener 对象
Class<?> listenerInfoClz = Class.forName("android.view.View$ListenerInfo");
Field mOnClickListener = DeclaredField("mOnClickListener");
mOnClickListener.setAccessible(true);
View.OnClickListener originOnClickListener = (View.OnClickListener) (listenerInfo);            // ⽤⾃定义的 OnClickListener 替换原始的 OnClickListener
View.OnClickListener hookedOnClickListener = new HookedOnClickListener(originOnClickListener);
mOnClickListener.set(listenerInfo, hookedOnClickListener);
} catch (Exception e) {
Log.e("tww", "hook clickListener failed!", e);
}
}
public class HookedOnClickListener implements View.OnClickListener {
private View.OnClickListener origin;
HookedOnClickListener(View.OnClickListener origin) {
}
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "hook click", Toast.LENGTH_SHORT).show();
Log.e("tww", "Before click, do what you want to to.");
if (origin != null) {
}
Log.e("tww", "After click, do what you want to to.");
}
}
}
startActivity()--->

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。