bytekit
bytekit copied to clipboard
Java Bytecode Kit
# no1. commit: 9e62fbc7cd85da9684dc7753b0cc059b7dc591cb ### 事出有因 这边在尝试增强kotlin1.4编译出来的class时,在一些lambda表达式中会出现增强失败的情况,其中使用了LocalVarsBinding,经过公司大佬的排查,发现kotlin会写入一些不会使用到的变量到 LocalVariableTable ,并且 LocalVarsBinding 在读取 LocalVariableTable 时,不会判定该变量是否有使用,因此增强后的字节码会校验失败. > Retransform时候的报错信息:  > Decompile时候的报错信息:  ### 期望的解决方法 如题,期待是能提供一个 exclude-pattern 支持,目前编译器产生的变量一般都是带有$的,通过表达式排除包含$的变量,能一定程度上解决这个问题. ### 如何复现 代码: https://github.com/isadliliying/bytekit/tree/wingli-before-line-enhance-error 增强报错的单元测试: com.alibaba.bytekit.asm.location.LineBeforeLocationMatcherEnhanceTest#testLocalVarsEnhanceError...
java.lang.IllegalArgumentException: Error at instruction 21: Expected an object reference, but found . test()V 00000 R . . . : : L0 00001 R . . . : : LINENUMBER 23...
背景: 1. ~~我们是个代码洁癖爱好者~~ 2.该方法既然是个通用的工具方法,那么当我们的clazz是个接口时,此时实现逻辑会有那么一点尴尬(同一个方法会重复callback)~~ //步骤1.getDeclaredMethods(clazz)方法功能其实是已经去clazz继承的接口中拿了一下default以及static类型的方法。 Method[] methods = getDeclaredMethods(clazz); for (Method method : methods) { XXX }if (clazz.getSuperclass() != null) { doWithMethods(clazz.getSuperclass(), mc, mf); } //此时由于clazz是个接口,会走到这里 else if (clazz.isInterface()) {...
java.lang.IllegalArgumentException: Error at instruction 21: Expected an object reference, but found . test()V 00000 R . . . : : L0 00001 R . . . : : LINENUMBER 23...
java.lang.IllegalArgumentException: Error at instruction 28: Expected an object reference, but found . test()V 00000 R . . . : : L0 00001 R . . . : : LINENUMBER 22...
环境: Windows 10 64 bit/Oracle JDK8 问题复现的demo(必现问题) -> https://github.com/kongwu-/bytekit-agent-sample Transform类很简单,什么增强内容都没做,只是调用了一下AsmUtils.toClassNode ```java public class SmpClassTransformer implements ClassFileTransformer { @Override public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer)...
haven't tried yet. maybe some part just works. guess still worth mentioning