package com.android.reverse.hook; import java.lang.reflect.Member; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import de.robv.android.xposed.XC_MethodHook.MethodHookParam; public class HookParam { public Member method; public Object thisObject; public Object[] args; private Object mResult; private Throwable mThrowable; private boolean mHasResult = false; private boolean mHasThrowable = false; private Map<String, Object> mExtra = null; private HookParam() { } public static HookParam fromXposed(MethodHookParam param) { HookParam xparam = new HookParam(); xparam.method = param.method; xparam.thisObject = param.thisObject; xparam.args = param.args; xparam.mResult = param.getResult(); xparam.mThrowable = param.getThrowable(); return xparam; } public boolean doesReturn(Class<?> result) { if (this.method instanceof Method) return (((Method) this.method).getReturnType().equals(result)); return false; } public void setResult(Object result) { if (result instanceof Throwable) { setThrowable((Throwable) result); } else { mResult = result; mHasResult = true; } } public boolean hasResult() { return mHasResult; } public Object getResult() { return mResult; } public boolean doesThrow(Class<?> ex) { if (this.method instanceof Method) for (Class<?> t : ((Method) this.method).getExceptionTypes()) if (t.equals(ex)) return true; return false; } public void setThrowable(Throwable ex) { mThrowable = ex; mHasThrowable = true; } public boolean hasThrowable() { return mHasThrowable; } public Throwable getThrowable() { return mThrowable; } public Object getExtras() { return mExtra; } @SuppressWarnings("unchecked") public void setExtras(Object extra) { mExtra = (Map<String, Object>) extra; } public void setObjectExtra(String name, Object value) { if (mExtra == null) mExtra = new HashMap<String, Object>(); mExtra.put(name, value); } public Object getObjectExtra(String name) { return (mExtra == null ? null : mExtra.get(name)); } }