首页 > 解决方案 > javassist ; 不见了

问题描述

谁能告诉我的代码有什么问题?使用 javassist 插入代码时,它显示错误“原因:编译错误:; is missing”;但我仔细检查,没有;完全失踪。javassist 这里有一些限制吗?

        ClassPool cp = ClassPool.getDefault();
        cp.importPackage("com.mysql.cj");

        CtClass cc = cp.get(clzname);
        CtMethod ms = cc.getDeclaredMethod(
                "execute");
        StringBuilder sb = new StringBuilder();
        sb.append("String sql = ((PreparedQuery) this.query).getOriginalSql();");
        sb.append("QueryBindings bindings = ((PreparedQuery) this.query).getQueryBindings();\n" +
                "        for (BindValue o : bindings.getBindValues()) {\n" +
                "            sql = sql.replaceFirst(\"\\\\?\", new String(o.getByteValue()));\n" +
                "        }");

        sb.append(
                "System.out.println( sql);");

        ms.insertBefore(sb.toString());
        byteCode = cc.toBytecode();

标签: javabytecodejavassist

解决方案


insertBefore 的 javadoc 说:

https://www.javassist.org/html/javassist/CtBehavior.html#insertBefore(java.lang.String)

参数: src - 表示插入字节码的源代码。它必须是单个语句或块。

因此,将代码包装在花括号中,使其成为一个块。


推荐阅读