当前位置: 首页 > 知识库问答 >
问题:

如果被拦截的方法调用另一个被拦截的方法,会发生什么

冯宏恺
2023-03-14

使用bytepal拦截类Foo,有两种方法A、B

在A方法中,B方法被调用。如果我们在intercetpor类栏中同时删除A和B到C方法,它们在第一行调用callable#call

会发生什么?这些方法的执行顺序是什么?

共有2个答案

燕禄
2023-03-14

你当然可以尝试一下,但会发生的是,内部调用将再次被拦截。方法不知道谁在调用它们。为了避免这种情况,可以通过StackWalker或使用异常生成堆栈跟踪来发现调用方。

葛修真
2023-03-14
package org.wxt.xtools.agents;

import static net.bytebuddy.matcher.ElementMatchers.isAbstract;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.namedOneOf;
import static net.bytebuddy.matcher.ElementMatchers.not;

import java.io.IOException;
import java.lang.instrument.Instrumentation;
import java.lang.reflect.Method;
import java.util.concurrent.Callable;

import net.bytebuddy.agent.ByteBuddyAgent;
import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.implementation.MethodDelegation;
import net.bytebuddy.implementation.bind.annotation.Origin;
import net.bytebuddy.implementation.bind.annotation.RuntimeType;
import net.bytebuddy.implementation.bind.annotation.SuperCall;
import net.bytebuddy.utility.JavaModule;

class Foo {
    public void methodA() {
        System.out.println("method A");
        methodB();
    }
    
    public void methodB() {
        System.out.println("method B");
    }
}

class Bar {
    @RuntimeType
    public static void interceptor(@Origin Class<?> clazz, @Origin Method method, @SuperCall Callable<?> callable,
            @net.bytebuddy.implementation.bind.annotation.This Object inst) throws Exception {
        callable.call();
        System.out.println("intercepting " + method.getName());
    }
}

public class Test {
    
    public static void premain(String agentArgs, Instrumentation inst) throws IOException {
        AgentBuilder.Transformer methodsTransformer = new AgentBuilder.Transformer() {
            @Override
            public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription,
                    ClassLoader classLoader, JavaModule javaModule) {
                return builder.method(namedOneOf("methodA", "methodB").and(not(isAbstract())))
                        .intercept(MethodDelegation.to(Bar.class));
            }
        };

        AgentBuilder.Listener listener = new AgentBuilder.Listener.WithErrorsOnly(
                new AgentBuilder.Listener.StreamWriting(System.out));

        new AgentBuilder.Default().type(named("org.wxt.xtools.agents.Foo")).transform(methodsTransformer)
                .with(listener).installOn(inst);
    }

    public static void main(String[] args) throws IOException {
        premain(null, ByteBuddyAgent.install());
        new Foo().methodA();
    }

}

结果

method A
method B
intercepting methodB
intercepting methodA
 类似资料:
  • 问题很简单 在这里打破头! 编辑:一个小突破。我打印了目标,它返回的是SimpleJPrepository,而不是实际的存储库。

  • 问题内容: 我有这个代码 有什么方法可以在没有子类化或修改类且没有工厂的情况下拦截呼叫? 编辑:抱歉忘了提到这是在Android平台上。 问题答案: 您是否考虑过面向方面的编程,甚至还考虑过AspectJ?有关AspectJ / Android的信息,请参见此处和此处。

  • 问题内容: 我正在使用Java EE 6和Jboss AS7.1,并尝试使用拦截器绑定(来自jboss网站的示例)。 我有一个InterceptorBinding注解: 拦截器: 还有一个豆: 但是拦截器没有被称为。。。 在编写此代码时将调用拦截器: 谢谢你的帮助。 问题答案: 您是否按照参考示例中的说明启用了拦截器? 缺省情况下,bean档案没有通过拦截器绑定绑定的已启用拦截器。必须通过将侦听器

  • 问题内容: 我正在用python实现RESTful Web服务,并想通过拦截函数调用并记录其执行时间等方式来添加一些QOS记录功能。 基本上,我想到了所有其他服务都可以从中继承的类,该类会自动覆盖默认方法的实现,并将其包装在logger函数中。实现此目标的最佳方法是什么? 问题答案: 像这样吗 这暗示着在您的方法中添加装饰器(如果您愿意,也可以基于此创建一个显式装饰器): 当您现在尝试类似的方法:

  • 本文向大家介绍SpringBoot拦截器实现登录拦截的方法示例,包括了SpringBoot拦截器实现登录拦截的方法示例的使用技巧和注意事项,需要的朋友参考一下 源码 GitHub:https://github.com/291685399/springboot-learning/tree/master/springboot-interceptor01 SpringBoot拦截器可以做什么 可以对UR

  • 我正在具体的类上创建动态代理。因为Java的普通代理类只对接口有帮助,所以我选择了cglib。 我使用带有MethodInterceptor的增强器类来拦截我的代理的方法,我能够拦截除静态方法之外的所有方法调用。 有什么方法可以使用cglib拦截对静态方法的调用吗?