有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java用ByteBuddy装饰一个方法

我如何定义一个方法,然后用ByteBuddy(多次)装饰它? 这是我的例子

Builder<Object> builder = new ByteBuddy().subclass(Object.class).name("Dynamic");
    builder = builder.defineMethod("method", void.class, Visibility.PUBLIC)
    .intercept(MethodDelegation.to(new Object(){
        
        @RuntimeType
        public void intercept(@This Object o) {
            System.out.println("Executing code...");
        }
        
    }));
    
    builder = builder.method(ElementMatchers.named("method")).
    intercept(MethodDelegation.to(new Object(){
        
        @RuntimeType
        public void intercept(@This Object o) {
            System.out.println("Executing other code...");
        }
        
    }));
    
    try {
        Class cls = builder.make()
                .load(StructClassBuilder.class.getClassLoader())
                .getLoaded();
        
        Object obj = cls.newInstance();
        cls.getDeclaredMethod("method").invoke(obj, args);
    } catch (Exception e1) {
        e1.printStackTrace();
    }

输出是

Executing other code...

我希望输出是

Executing code...

Executing other code...

谢谢


共 (1) 个答案

  1. # 1 楼答案

    一种选择是使用MethodDelegation链接拦截器。到(…)。然后方法

    public class ByteBuddyTest {
    
      public static void main(String[] args) throws Exception {
        DynamicType.Builder<Object> builder = new ByteBuddy().subclass(Object.class).name("Dynamic");
        builder = builder
            .defineMethod("method", void.class, Visibility.PUBLIC)
            .intercept(MethodDelegation.to(Interceptor1.class).andThen(MethodDelegation.to(Interceptor2.class)));
    
        try {
            Class<?> clazz = builder.make().include().load(ByteBuddyTest.class.getClassLoader()).getLoaded();
    
            Object obj = clazz.newInstance();
            clazz.getDeclaredMethod("method").invoke(obj, args);
        } catch (Exception e1) {
            e1.printStackTrace();
        }
      }
    
      public static class Interceptor1 {
    
          public static void intercept() {
              System.out.println("Executing code...");
          }
      }
    
      public static class Interceptor2 {
    
          public static void intercept() {
              System.out.println("Executing other code...");
          }
      }
    }