提供了一种简单的方法来增强(织)编译后的字节码。

导入项目中的方法可以参考官网:http://commons.apache.org/proper/commons-weaver/index.html

实例:​只有使用了@WebExposed注解的类才会暴露给REST API​下面是代码

  package example;

  import java.lang.annotation.ElementType;

  import java.lang.annotation.Retention;

  import java.lang.annotation.RetentionPolicy;

  import java.lang.annotation.Target;

  /**

   * Marks methods that interest our weaver module.

   */

  @Target(ElementType.METHOD)

  @Retention(RetentionPolicy.CLASS)

  public ​@interface WebExposed​ {

  }

   package example;

  /**

   * Represents a user in our system.

   */

  public class User {

      private String name;

      private String surname;

      private Integer age;

      public User() {

          super();

      }

      public User(String name, String surname, Integer age) {

          super();

          this.name = name;

          this.surname = surname;

          this.age = age;

      }

      ​@WebExposed

      public String getName() {

          return name;

      }

      public void setName(String name) {

          this.name = name;

      }

      ​@WebExposed

      public String getSurname() {

          return surname;

      }

      public void setSurname(String surname) {

          this.surname = surname;

      }

  }


  自定义weaver

   package example;

  import java.io.File;

  import java.lang.annotation.ElementType;

  import java.util.Arrays;

  import java.util.Properties;

  import org.apache.commons.weaver.WeaveProcessor;

  import org.apache.commons.weaver.model.AnnotatedElements;

  import org.apache.commons.weaver.model.ScanRequest;

  import org.apache.commons.weaver.model.ScanResult;

  import org.apache.commons.weaver.model.Scanner;

  import org.apache.commons.weaver.model.WeavableMethod;

  import org.apache.commons.weaver.model.WeaveEnvironment;

  import org.apache.commons.weaver.model.WeaveInterest;

  import org.apache.commons.weaver.spi.Weaver;

  public class MyWeaver​ implements Weaver {

      @Override

      public boolean ​process​(WeaveEnvironment environment, Scanner scanner) {

          // We want to find methods annotated with @WebExposed.

          ​WeaveInterest ​findAnnotation = WeaveInterest.of(WebExposed.class, ElementType.METHOD);

          ​ScanResult ​scanResult = scanner.scan(new ScanRequest().add(findAnnotation));

          ​AnnotatedElements​<WeavableMethod<?>> annotatedMethods = scanResult.getMethods();

          for (WeavableMethod<?> method : annotatedMethods) {

              // The API code is out of the scope of this guide, but you can do other things here, 

              // like modifying your class

              System.out.println("Expose method " + method.getTarget().getName() + " in our REST API");

          }

          return true;

      }

  }

  在运行实例之前你需要告诉ServiceProvider你自定义的weaver,可以通过向​META-INF目录下添加如下文件实现

  文件:src/main/resources/META-INF/services/org.apache.commons.weaver.spi.Weaver

  内容:example.MyWeaver

学习:apache commons weaver介绍及使用_apache