Инструментарий конструкторов в Javassist с использованием insertAfter - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь инструктировать конструкторов распечатать что-то, когда они вызываются. Я делаю это с помощью insertAfter . Я также хотел распечатать ссылку на объект. Я попытался использовать $_, но это было просто установлено на 0. Возможно ли распечатать ссылку на объект нового объекта?

1 Ответ

0 голосов
/ 13 апреля 2019

Я закончил поиском решения того, что хотел.Он состоял из ExprEditor , например:

public CtClass instrumentMethods() throws CannotCompileException, IOException {
    ClassPool cp = ClassPool.getDefault();
    cp.insertClassPath(new LoaderClassPath(loader));
    CtClass ctKlazz = cp.makeClass(instream);

    CtMethod[] methods = ctKlazz.getMethods();
    for (CtMethod method : methods) {
        final CtBehavior method = methods[ind];
        method.instrument(
            new ExprEditor() {
                // Instrument new expressions:
                public void edit(NewExpr expr) throws CannotCompileException {
                    final int allocSiteId = getAllocSiteId(className, expr.indexOfBytecode());
                    expr.replace( "{ $_ = $proceed($$); someCodeHere($_); }");
                }
            }
        );
        method.insertBefore("{ someInstrumentationAtStart(); }");
    }

    return ctKlazz;
}
...