将Method中的代码插入新类

时间:2017-07-19 17:28:24

标签: java kotlin byte-buddy

我正在尝试在bytebuddy之上创建一个可用于在类上执行运行时转换的库。我正在制作的API不能直接用ByteBuddy将方法代码插入到转换类中(我希望将未注释的方法添加到转换后的类中,并使用@Inject注释的方法注入我现有方法的头或尾),我缺乏互操作性的解决方案是使用ByteBuddy创建一个临时类,它在我的更高级API和ByteBuddy的Advice API之间进行转换。但我无法弄清楚如何将更高级API中的方法中的所有代码插入到较低级别API中定义的方法中,因为我实际上无法使用Advice来执行此操作。有没有办法可以做到这一点?

这是我在这一点上提出的代码

fun apply(vararg transformerClasses: Class<*>) {
    for(clazz in transformerClasses) {
        val builder = ByteBuddy()
                .subclass(clazz)
        val mixinAnnotation = clazz.getAnnotation(Mixin::class.java) as? Mixin ?: throw RuntimeException("Passed transformer class without @Mixin annotation")
        val mixinTarget = mixinAnnotation.target.java

        for(method in clazz.declaredMethods) {
            if(method.annotations.isEmpty()) {
                builder.defineMethod(method.name, method.returnType, Visibility.PUBLIC, Ownership.STATIC)
                        .intercept(???)
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

没有一个很好的方法可以做到这一点,但是一个解决方案就是用creste TypeDescription实例将你的自定义注释转换为Byte Buddy的注释。 您可以使用InstrumentedType的实现来创建此类对象。

如果类名匹配,Byte Buddy仍会从正确的类文件中读取字节代码。类文件和类型描述之间没有一致性检查。