【问题标题】:I cannot create a new object using javassist if I try to override a method如果我尝试覆盖方法,我无法使用 javassist 创建新对象
【发布时间】:2017-03-27 18:10:55
【问题描述】:

我正在使用 CtNewMethod.make 在类中注入一个新方法,如果我在方法中使用的对象没有被修改,一切似乎都工作正常: 我做了一个自定义方法来获取对象:

public String getObj() {
   return "new bgr()";
}

但是,如果我尝试重写这样的方法:

public String getObj() {
return "new bgr() " +
            "{" +
                "public void a(int x, int y, float pt) {" +
                    "super.a(x, y, pt);" +
                "}" +
            "}";
}

它给了我一个错误: javassist.CannotCompileException: [源错误]) 丢失

即使使用“)”字符,我也尝试了所有方法,但似乎没有任何效果

提前致谢

PS:方法和类确实存在,只是由于jar被混淆了,它们只是随机命名

【问题讨论】:

    标签: java methods overriding code-injection javassist


    【解决方案1】:

    根据 javassist 文档“不支持内部类或匿名类”:https://jboss-javassist.github.io/javassist/tutorial/tutorial2.html#limit

    您唯一的选择是生成一个扩展“bgr”并覆盖bgr::a 方法的新类(我们称之为“bgrExt”)。然后在您的代码中实例化为new bgrExt()

    【讨论】:

    • 嗯,这就解释了。虽然我真的不知道你应该如何创建一个扩展的,我应该把它作为一个新的 CtClass 吗?
    • 是的,类似于:ClassPool cp =...; CtClass cc = cp.makeClass("bgrExt"); cc.setSuperclass(cp.get("bgr"));
    • 我成功了!非常感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    相关资源
    最近更新 更多