【问题标题】:Method Swizzling in Android using java使用 java 在 Android 中进行方法 Swizzling
【发布时间】:2025-12-19 23:50:06
【问题描述】:

是否可以使用 java 在 android 中进行方法调配?我想拦截一个系统方法并记录它的参数然后正常处理它

【问题讨论】:

    标签: java android


    【解决方案1】:

    我认为该技术无法在任何环境中使用 Java。

    也许您可以使用 AOP 获得类似的结果。

    但在 Android 上,您可以用它做些什么看起来有限。见Aspect-oriented programming in android。实际上,由于您不会编译目标代码(系统方法),因此编译时编织(这似乎是您在 Android 上可以使用的全部)对于这种情况将毫无用处。就像我想的这个答案一样。

    另一个想法...我猜你想始终如一地做这个记录。但如果您需要它来调试问题,您可以使用conditional breakpoint in Eclipse 来完成。

    条件表达式可以包含任意 Java 代码,并且可以 包含多个语句,允许断点条件 实现跟踪等功能。例如,一个条件可以执行 一个打印语句,然后返回一个硬编码值以永不挂起 ("System.out.println(...); return false;").

    我不知道这是否适用于 Android SDK 中的方法。但它确实适用于 Java SDK 中的方法。例如,下面是简单的代码:

        System.err.println("foo");
    

    我在 PrintStream.print 中做了一个条件断点,像这样:

    System.err.println("hello: " + arg0);
    return false;
    

    而在程序中调试时的控制台输出是这样的:

    hello: foo
    foo
    

    请注意,由于JDK不是用调试符号编译的,所以我不能按名称引用方法参数,而是使用arg0..argn

    【讨论】:

    • 这是否也适用于来自 android sdk 的 api 方法?