提供了一种简单的方法来增强(织)编译后的字节码。
导入项目中的方法可以参考官网: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