From 445236854b3c2fcd7985aa4ab137fb90005a183b Mon Sep 17 00:00:00 2001 From: hengyunabc Date: Thu, 23 Apr 2020 19:24:44 +0800 Subject: [PATCH] support bindding MethodDesc, MethodName --- .../arthas/bytekit/asm/binding/Binding.java | 38 +++++++++++++++++-- .../asm/binding/MethodNameBinding.java | 25 ++++++++++++ .../bytekit/asm/interceptor/AtEnterTest.java | 6 ++- 3 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 bytekit/src/main/java/com/taobao/arthas/bytekit/asm/binding/MethodNameBinding.java 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; }