Bytebuddy:基于名称而不是类在Iterface上应用转换

时间:2019-01-09 09:14:31

标签: java byte-buddy

我想对实现特定接口的类进行转换,但是由于类加载问题,我想按名称而不是通过提供类来进行转换。有办法吗?

我的意思是,而不是:

new AgentBuilder.Default()
        .disableClassFormatChanges()
        .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
        .with(AgentBuilder.InitializationStrategy.NoOp.INSTANCE)
        .with(AgentBuilder.TypeStrategy.Default.REDEFINE)
        .type(isSubTypeOf(myClass.class).and(not(isAbstract())).and(not(isInterface())))
        .transform(new AgentBuilder.Transformer.ForAdvice()
                .advice((ElementMatchers.named("method")),
                        "adviceClass"))
        .installOn(inst);

我想做这样的事情(请注意下面的isSubTypeOf()):

new AgentBuilder.Default()
        .disableClassFormatChanges()
        .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
        .with(AgentBuilder.InitializationStrategy.NoOp.INSTANCE)
        .with(AgentBuilder.TypeStrategy.Default.REDEFINE)
        .type(isSubTypeOf(**TypeDescription.ForLoadedType.ofName(className)**).and(not(isAbstract())).and(not(isInterface())))
        .transform(new AgentBuilder.Transformer.ForAdvice()
                .advice((ElementMatchers.named("method")),
                        "adviceClass"))
        .installOn(inst);

有办法吗?

1 个答案:

答案 0 :(得分:0)

有一个匹配器:hasSuperType(named(className))。另外,您可以实现自己的匹配器,仅浏览类型层次结构。例如,如果您知道所讨论的类型不是接口,这可能会稍微提高效率。