使用ASM获取方法参数



我发现了一些例子,向我展示了使用MethodAdapter的某些方法调用的位置:

public void visitMethodInsn(int opcode, String owner, String name, String desc) {
        if (owner.equals(targetClass)
                && name.equals(targetMethod.getName())
                && desc.equals(targetMethod.getDescriptor())) {
            callsTarget = true;
        }
  }

我需要参数,例如,如果我有object.getText("mykey"),我想获得文本"mykey"。

我有一个框架,你可能会发现有用的(特别是,procyon-compilertools)。它将使您能够以比ASM更面向对象的方式完成您的要求。然而,该项目仍处于早期开发阶段,可能会发生变化,因此我不建议在生产项目中使用它。

你可以用这个作为起点:

public class CallInspectionSample {
    static class Target {
        public static void main(String[] args) {
            new Target().getText("MyKey");
        }
        public String getText(final String key) {
            return null;
        }
    }
    public static void main(String[] args) {
        final TypeReference targetType = MetadataSystem.instance().lookupType("CallInspectionSample$Target");
        final TypeDefinition resolvedType = targetType.resolve();
        final MethodDefinition mainMethod = resolvedType.getDeclaredMethods().get(1);
        final MethodDefinition getTextMethod = resolvedType.getDeclaredMethods().get(2);
        final MethodBody mainBody = mainMethod.getBody();
        final Block methodAst = new Block();
        final DecompilerContext context = new DecompilerContext();
        context.setCurrentType(resolvedType);
        context.setCurrentMethod(mainMethod);
        methodAst.getBody().addAll(AstBuilder.build(mainBody, true, context));
        AstOptimizer.optimize(context, methodAst);
        for (final Expression e : methodAst.getChildrenAndSelfRecursive(Expression.class)) {
            if (e.getCode() == AstCode.InvokeVirtual &&
                ((MethodReference) e.getOperand()).resolve() == getTextMethod) {
                // Analyze arguments here (skip first for instance methods)...
                System.out.println(e.getArguments());
            }
        }
    }
}

(示例输出[initobject:Target(Target::<init>), ldc:String("MyKey")])

相关内容

  • 没有找到相关文章

最新更新