diff --git a/bytekit/src/main/java/com/taobao/arthas/bytekit/asm/binding/Binding.java b/bytekit/src/main/java/com/taobao/arthas/bytekit/asm/binding/Binding.java index 9aa746bc5..cd38c7770 100644 --- a/bytekit/src/main/java/com/taobao/arthas/bytekit/asm/binding/Binding.java +++ b/bytekit/src/main/java/com/taobao/arthas/bytekit/asm/binding/Binding.java @@ -214,7 +214,6 @@ public abstract class Binding { return new InvokeMethodDeclarationBinding(); } } - @Documented @Retention(RetentionPolicy.RUNTIME) @@ -223,15 +222,46 @@ public abstract class Binding { public static @interface Method { boolean optional() default false; } - + public static class MethodBindingParser implements BindingParser { @Override public Binding parse(Annotation annotation) { return new MethodBinding(); } - + } - + + @Documented + @Retention(RetentionPolicy.RUNTIME) + @java.lang.annotation.Target(ElementType.PARAMETER) + @BindingParserHandler(parser = MethodNameBindingParser.class) + public static @interface MethodName { + boolean optional() default false; + } + + public static class MethodNameBindingParser implements BindingParser { + @Override + public Binding parse(Annotation annotation) { + return new MethodNameBinding(); + } + + } + + @Documented + @Retention(RetentionPolicy.RUNTIME) + @java.lang.annotation.Target(ElementType.PARAMETER) + @BindingParserHandler(parser = MethodDescBindingParser.class) + public static @interface MethodDesc { + boolean optional() default false; + } + + public static class MethodDescBindingParser implements BindingParser { + @Override + public Binding parse(Annotation annotation) { + return new MethodDeclarationBinding(); + } + } + @Documented @Retention(RetentionPolicy.RUNTIME) @java.lang.annotation.Target(ElementType.PARAMETER) diff --git a/bytekit/src/main/java/com/taobao/arthas/bytekit/asm/binding/MethodNameBinding.java b/bytekit/src/main/java/com/taobao/arthas/bytekit/asm/binding/MethodNameBinding.java new file mode 100644 index 000000000..148d5178f --- /dev/null +++ b/bytekit/src/main/java/com/taobao/arthas/bytekit/asm/binding/MethodNameBinding.java @@ -0,0 +1,25 @@ +package com.taobao.arthas.bytekit.asm.binding; + +import com.alibaba.arthas.deps.org.objectweb.asm.Type; +import com.alibaba.arthas.deps.org.objectweb.asm.tree.InsnList; +import com.taobao.arthas.bytekit.asm.MethodProcessor; +import com.taobao.arthas.bytekit.utils.AsmOpUtils; + +/** + * @author hengyunabc + * + */ +public class MethodNameBinding extends Binding { + + @Override + public void pushOntoStack(InsnList instructions, BindingContext bindingContext) { + MethodProcessor methodProcessor = bindingContext.getMethodProcessor(); + AsmOpUtils.ldc(instructions, methodProcessor.getMethodNode().name); + } + + @Override + public Type getType(BindingContext bindingContext) { + return Type.getType(String.class); + } + +} diff --git a/bytekit/src/test/java/com/taobao/arthas/bytekit/asm/interceptor/AtEnterTest.java b/bytekit/src/test/java/com/taobao/arthas/bytekit/asm/interceptor/AtEnterTest.java index 5dead641f..1eb8099b5 100644 --- a/bytekit/src/test/java/com/taobao/arthas/bytekit/asm/interceptor/AtEnterTest.java +++ b/bytekit/src/test/java/com/taobao/arthas/bytekit/asm/interceptor/AtEnterTest.java @@ -63,9 +63,13 @@ public class AtEnterTest { @Binding.Field(name = "longField") Object longFieldObject, @Binding.Field(name = "intField") int intField, @Binding.Field(name = "strField") String strField, - @Binding.Field(name = "intField") Object intFielObject + @Binding.Field(name = "intField") Object intFielObject, + @Binding.MethodName String methodName, + @Binding.MethodDesc String methodDesc ) { System.err.println("onEnter, object:" + object); + System.err.println("onEnter, methodName:" + methodName); + System.err.println("onEnter, methodDesc:" + methodDesc); return 123L; }