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

用bytebuddy截获错误构造函数

单修德
2023-03-14

由于某些原因,我还不能计算出,我的代理没有拦截java LinkageError实例。

代理代码:

import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.implementation.MethodDelegation;
import net.bytebuddy.implementation.SuperMethodCall;
import net.bytebuddy.matcher.ElementMatchers;
import java.lang.instrument.Instrumentation;

public class MyAgent {
    public static void premain(String arguments, Instrumentation instrumentation) {
        new AgentBuilder.Default()
            .type(ElementMatchers.isSubTypeOf(LinkageError.class))
            .transform((builder, type, classLoader, module) ->
                    builder.constructor(ElementMatchers.isDefaultConstructor())
                            .intercept(SuperMethodCall.INSTANCE.andThen(MethodDelegation.to(MyInterceptor.class)))
            ).installOn(instrumentation);
    }
}

拦截器代码

public class MyInterceptor {
    @RuntimeType
    public static void intercept(@Origin Constructor<?> constructor) throws Exception {
        System.out.println("Intercepted: " + constructor.getName());
    }
}

测试代码:

public static void main(String[] args) {
    new NoClassDefFoundError("should be intercepted!!!").toString();
    new Foo("oh").toString();
}

令人费解的是替换元素匹配器。isSubTypeOf(LinkageError.class)带有元素匹配器。nameContains(“Foo”)给出了预期的结果,并且拦截了Foo构造函数。

共有1个答案

袁阿苏
2023-03-14

NoClassDefFoundError由引导加载程序加载。它将无法看到您的拦截器类,这就是它永远不会被触发的原因。

尝试使用建议类(作为访问者)将字节码添加到匹配的类中,这样可以解决此问题。

 类似资料:
  • 我有一个继承自父类Point的子类行,我没有在子类中使用基类的构造函数,但是我得到了这个错误: '形状。点“不包含接受0个参数的构造函数 这是我的父类: 这是我的孩子班:

  • 我有一个类(我不能修改),它只有一个构造函数,它接受一个参数,如下所示: 由于构造函数可以抛出错误,我想实现错误处理。我的第一次尝试是: 但是,现在在块的范围内,不能在其他地方使用。如果我理解正确,我不能在没有初始化的情况下声明对象,因此我可以在块之外声明。那么,我该如何捕捉构造函数抛出的错误呢? 编辑:为了澄清,这是在我的中,在中我将中止程序。此外,参数是一个将被打开的文件,因此没有已知的安全输

  • 当我在代码中进行扫描后到达此部分时,我收到此错误: Project2_JoshuaLucas[,0,0,0x0,无效,布局=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=350,hei

  • 有什么想法为什么我可能会看到这门课的以下消息吗? 消息 我不知道为什么这行不通。当我移除super()时,错误就会消失,所以这似乎会引起一些问题。

  • 问题内容: 这是我的代码。我在ArraryAdapter上收到错误消息。 如何用数组填充? 这是我的XML: 问题答案: 片段不是上下文对象。您需要将Activity对象(Fragment.getActivity())作为第一个参数传递。

  • 让我有一个这样的界面: 还有这样一个实现类: 现在我想使用bytebuddy创建一个拦截器/代理,它捕捉对setter的调用,存储更改后的值,并调用real方法。 最后,我想向拦截器/代理“询问”被调用的setter和更改的值。 我尝试了很多考虑也教程,但到目前为止,我发现没有工作的解决方案。也许有人可以帮助我。 这是拦截器: 以下是我当前的“测试”代码: 编辑: