-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathWriteProcessor.java
68 lines (64 loc) · 3.24 KB
/
WriteProcessor.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package compiler.processor.write;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeKind;
import javax.tools.JavaFileObject;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.Set;
import java.util.stream.Collectors;
@SupportedAnnotationTypes("ProcessorClass")
@SupportedSourceVersion(SourceVersion.RELEASE_21)
public class WriteProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
// 仅处理接口
roundEnv.getRootElements()
.stream()
.filter(TypeElement.class::isInstance)
.map(TypeElement.class::cast)
.filter(element -> element.getKind() == ElementKind.INTERFACE)
.forEach(this::write);
return false;
}
private void write(TypeElement root) {
try {
JavaFileObject sourceFile = processingEnv.getFiler().createSourceFile(root.getSimpleName() + "Impl");
try (OutputStream outputStream = sourceFile.openOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(outputStream)) {
writer.write("public class " + root.getSimpleName() + "Impl implements " + root + " {\n");
// 写入方法
root.getEnclosedElements()
.stream()
.filter(ExecutableElement.class::isInstance)
.map(ExecutableElement.class::cast)
.forEach(element -> {
if (!element.getReturnType().equals(processingEnv.getTypeUtils().getNoType(TypeKind.VOID))) {
processingEnv.getMessager().printError("仅支持void返回", element);
}
String parameters = element.getParameters()
.stream()
.map(e -> e.asType() + " " + e.getSimpleName())
.collect(Collectors.joining(", "));
try {
writer.write(" @Override\n");
writer.write(" public void " + element.getSimpleName() + "(" + parameters + ") {\n");
writer.write(" System.out.println(\"" + element.getSimpleName() + "(" + parameters + ") print\");\n");
writer.write(" }\n");
} catch (Exception e) {
processingEnv.getMessager().printError("失败: " + e.getMessage(), element);
}
});
writer.write("}");
}
} catch (Exception e) {
processingEnv.getMessager().printError("失败: " + e.getMessage(), root);
}
}
}