java - 将方法中的代码插入到新类中

标签 java kotlin byte-buddy

我正在尝试在 bytebuddy 之上创建一个库,可用于对类执行运行时转换。我正在制作的 API 不能直接与 ByteBuddy 一起操作,将方法代码插入到转换后的类中(我希望将未注释的方法全新添加到转换后的类中,并将用 @Inject 注释的方法注入(inject)到现有方法的头部或尾部),针对缺乏互操作性的问题,我的解决方案是使用 ByteBuddy 创建一个临时类,该类在我的更高级别 API 和 ByteBuddy 的建议 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(???)
            }
        }
    }
}

最佳答案

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

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

关于java - 将方法中的代码插入到新类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45197281/

相关文章:

Java 到 C 对象传递

android - Jetpack compose 中的 Google pay Api - 如何

android - @StringRes、@DrawableRes、@LayoutRes 等 android 注解 lint 检查与 kotlin 参数

java - 在泛型方法中使用 instanceof

java - Web3j java 函数调用在 solidity 合约上返回空列表

java - 使用 ByteBuddy 覆盖运行时类

java - 调用通过 ByteBuddy 检测的 java 代理时出现异常

java - 从 Byte Buddy 0.7.7 迁移到 1.0.2 时遇到问题

java - 为什么有些 API 只提供接口(interface),而不是类?

kotlin - 如何从rxjava中的列表列表执行过滤器运算符