我正在尝试在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(???)
}
}
}
}
答案 0 :(得分:0)
没有一个很好的方法可以做到这一点,但是一个解决方案就是用creste TypeDescription
实例将你的自定义注释转换为Byte Buddy的注释。
您可以使用InstrumentedType
的实现来创建此类对象。
如果类名匹配,Byte Buddy仍会从正确的类文件中读取字节代码。类文件和类型描述之间没有一致性检查。