Skip to content

Commit 7ad9f83

Browse files
committed
java/se: add serial impl for annotation
1 parent 3f7a7b9 commit 7ad9f83

File tree

6 files changed

+95
-39
lines changed

6 files changed

+95
-39
lines changed

java/javase/javase-annotation/annotation-processor/src/main/java/cn/edu/ntu/java/annotations/Serial.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
/**
66
* @author alice52
77
*/
8-
@Retention(RetentionPolicy.CLASS)
8+
@Retention(RetentionPolicy.SOURCE)
99
@Target({ElementType.TYPE})
1010
@Inherited
1111
public @interface Serial {
12-
String value() default "";
12+
long value() default 4654816360795179002L;
1313
}

java/javase/javase-annotation/annotation-processor/src/main/java/cn/edu/ntu/java/processor/BaseProcessor.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.sun.source.tree.Tree;
44
import com.sun.tools.javac.api.JavacTrees;
5+
import com.sun.tools.javac.code.Symtab;
6+
import com.sun.tools.javac.code.Types;
57
import com.sun.tools.javac.processing.JavacProcessingEnvironment;
68
import com.sun.tools.javac.tree.JCTree;
79
import com.sun.tools.javac.tree.TreeMaker;
@@ -33,8 +35,9 @@ public abstract class BaseProcessor extends AbstractProcessor {
3335
public JavacTrees trees;
3436
public TreeMaker treeMaker;
3537
public Names names;
36-
3738
public List<Function<JCTree.JCVariableDecl, JCTree.JCMethodDecl>> c = new ArrayList<>();
39+
private Types types;
40+
private Symtab syms;
3841

3942
protected abstract Class<? extends Annotation> anno();
4043

@@ -48,6 +51,8 @@ public synchronized void init(ProcessingEnvironment processingEnv) {
4851
Context context = ((JavacProcessingEnvironment) processingEnv).getContext();
4952
this.treeMaker = TreeMaker.instance(context);
5053
this.names = Names.instance(context);
54+
this.types = Types.instance(context);
55+
this.syms = Symtab.instance(context);
5156
}
5257

5358
@Override

java/javase/javase-annotation/annotation-processor/src/main/java/cn/edu/ntu/java/processor/DataProcessorV2.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ private JCTree.JCMethodDecl addGetterMethod(JCTree.JCVariableDecl jcVariableDecl
5757
List<JCTree.JCTypeParameter> methodGenericParams = List.nil();
5858
List<JCTree.JCVariableDecl> parameters = List.nil();
5959
List<JCTree.JCExpression> throwsClauses = List.nil();
60+
6061
// 构建方法
6162
return treeMaker.MethodDef(
6263
modifiers,
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,79 @@
11
package cn.edu.ntu.java.processor;
22

33
import cn.edu.ntu.java.annotations.Serial;
4+
import cn.hutool.core.util.RandomUtil;
5+
import com.sun.tools.javac.api.JavacTrees;
6+
import com.sun.tools.javac.code.Flags;
7+
import com.sun.tools.javac.code.Symtab;
8+
import com.sun.tools.javac.code.Types;
9+
import com.sun.tools.javac.processing.JavacProcessingEnvironment;
10+
import com.sun.tools.javac.tree.JCTree;
11+
import com.sun.tools.javac.tree.TreeMaker;
12+
import com.sun.tools.javac.tree.TreeTranslator;
13+
import com.sun.tools.javac.util.Context;
14+
import com.sun.tools.javac.util.Names;
415
import org.slf4j.Logger;
516
import org.slf4j.LoggerFactory;
617

7-
import javax.annotation.processing.AbstractProcessor;
8-
import javax.annotation.processing.RoundEnvironment;
9-
import javax.annotation.processing.SupportedAnnotationTypes;
10-
import javax.annotation.processing.SupportedSourceVersion;
18+
import javax.annotation.processing.*;
1119
import javax.lang.model.SourceVersion;
12-
import javax.lang.model.element.Element;
1320
import javax.lang.model.element.TypeElement;
14-
import javax.tools.Diagnostic;
1521
import java.util.Set;
1622

1723
/**
1824
* @author alice52
1925
*/
2026
@SupportedSourceVersion(SourceVersion.RELEASE_8)
21-
@SupportedAnnotationTypes("cn.edu.ntu.java.annotation.Serial")
27+
@SupportedAnnotationTypes("cn.edu.ntu.java.annotations.Serial")
2228
public class SerialProcessor extends AbstractProcessor {
23-
2429
private static final Logger log = LoggerFactory.getLogger(SerialProcessor.class);
30+
public JavacTrees trees;
31+
public TreeMaker treeMaker;
32+
public Names names;
33+
long serialNumber = RandomUtil.randomLong(1000000000000000L, 9999999999999999L);
34+
private Types types;
35+
private Symtab syms;
36+
37+
@Override
38+
public synchronized void init(ProcessingEnvironment processingEnv) {
39+
super.init(processingEnv);
40+
this.trees = JavacTrees.instance(processingEnv);
41+
Context context = ((JavacProcessingEnvironment) processingEnv).getContext();
42+
this.treeMaker = TreeMaker.instance(context);
43+
this.names = Names.instance(context);
44+
this.types = Types.instance(context);
45+
this.syms = Symtab.instance(context);
46+
}
2547

2648
@Override
2749
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
28-
for (TypeElement te : annotations) {
29-
for (Element e : roundEnv.getElementsAnnotatedWith(te)) {
30-
Serial util = e.getAnnotation(Serial.class);
31-
if (util != null) {
32-
final String value = util.value();
33-
log.info(">>>>>>>>>>>> util value: " + value);
34-
// 1. 如果打印 error, 直接直接中断
35-
processingEnv
36-
.getMessager()
37-
.printMessage(
38-
Diagnostic.Kind.WARNING, ">>>>>>>>>>>> util value = " + value);
39-
}
40-
}
41-
}
50+
51+
TreeTranslator translator =
52+
new TreeTranslator() {
53+
@Override
54+
public void visitClassDef(JCTree.JCClassDecl f) {
55+
56+
JCTree.JCVariableDecl name =
57+
treeMaker.VarDef(
58+
treeMaker.Modifiers(
59+
Flags.NAME_FILLED
60+
| Flags.PRIVATE
61+
| Flags.STATIC
62+
| Flags.FINAL),
63+
names.fromString("serialVersionUID"),
64+
treeMaker.Type(syms.longType),
65+
treeMaker.Literal(serialNumber));
66+
67+
f.defs = f.defs.prepend(name);
68+
69+
super.visitClassDef(f);
70+
}
71+
};
72+
73+
roundEnv.getElementsAnnotatedWith(Serial.class).stream()
74+
.map(element -> trees.getTree(element))
75+
.forEach(jcTree -> jcTree.accept(translator));
76+
4277
return true;
4378
}
4479
}

java/javase/javase-annotation/annotation-processor/src/main/java/cn/edu/ntu/java/processor/TrisceliVersionProcessor.java

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -48,27 +48,40 @@ public SourceVersion getSupportedSourceVersion() {
4848
@Override
4949
public Set<String> getSupportedAnnotationTypes() {
5050
HashSet<String> set = new HashSet<>();
51-
set.add(TrisceliVersion.class.getName()); // 支持解析的注解
51+
// 支持解析的注解
52+
set.add(TrisceliVersion.class.getName());
5253
return set;
5354
}
5455

5556
@Override
5657
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
57-
for (TypeElement t : annotations) {
58-
for (Element e :
59-
roundEnv.getElementsAnnotatedWith(t)) { // 获取到给定注解的element(element可以是一个类、方法、包等)
60-
// JCVariableDecl 为字段/变量定义语法树节点
61-
JCTree.JCVariableDecl jcv = (JCTree.JCVariableDecl) javacTrees.getTree(e);
62-
String varType = jcv.vartype.type.toString();
63-
if (!"java.lang.String".equals(varType)) { // 限定变量类型必须是String类型,否则抛异常
64-
printErrorMessage(e, "Type '" + varType + "'" + " is not support.");
65-
}
66-
jcv.init = treeMaker.Literal(getVersion()); // 给这个字段赋值,也就是getVersion的返回值
67-
}
68-
}
58+
59+
roundEnv.getElementsAnnotatedWith(TrisceliVersion.class).stream()
60+
.map(element -> javacTrees.getTree(element))
61+
.map(x -> (JCTree.JCVariableDecl) x)
62+
.forEach(jcv -> jcv.init = treeMaker.Literal(getVersion()));
63+
6964
return true;
7065
}
7166

67+
// @Override
68+
// public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv)
69+
// {
70+
// for (TypeElement t : annotations) {
71+
// // 获取到给定注解的element(element可以是一个类、方法、包等)
72+
// for (Element e : roundEnv.getElementsAnnotatedWith(t)) {
73+
// // JCVariableDecl 为字段/变量定义语法树节点
74+
// JCTree.JCVariableDecl jcv = (JCTree.JCVariableDecl) javacTrees.getTree(e);
75+
// String varType = jcv.vartype.type.toString();
76+
// if (!"java.lang.String".equals(varType)) { // 限定变量类型必须是String类型,否则抛异常
77+
// printErrorMessage(e, "Type '" + varType + "'" + " is not support.");
78+
// }
79+
// jcv.init = treeMaker.Literal(getVersion()); // 给这个字段赋值,也就是getVersion的返回值
80+
// }
81+
// }
82+
// return true;
83+
// }
84+
7285
/**
7386
* 利用 processingEnv 内的 Messager 对象输出一些日志
7487
*
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
cn.edu.ntu.java.processor.DataProcessor
2-
cn.edu.ntu.java.processor.DataProcessorV2
2+
cn.edu.ntu.java.processor.DataProcessorV2
3+
cn.edu.ntu.java.processor.TrisceliVersionProcessor
4+
cn.edu.ntu.java.processor.SerialProcessor

0 commit comments

Comments
 (0)