1010import com .sun .tools .javac .tree .TreeTranslator ;
1111import com .sun .tools .javac .util .Context ;
1212import com .sun .tools .javac .util .Names ;
13+ import org .springframework .lock .annotation .WriteLock ;
1314
1415import javax .annotation .processing .*;
1516import javax .lang .model .SourceVersion ;
1617import javax .lang .model .element .Element ;
1718import javax .lang .model .element .ExecutableElement ;
1819import javax .lang .model .element .TypeElement ;
1920import javax .tools .Diagnostic ;
21+ import java .util .HashMap ;
2022import java .util .HashSet ;
23+ import java .util .Map ;
2124import java .util .Set ;
2225
2326import static com .sun .tools .javac .util .List .nil ;
2427import static com .sun .tools .javac .tree .JCTree .*;
28+ import static com .sun .tools .javac .util .List .of ;
2529
2630/**
2731 * 写锁的处理器,用来将写锁编译进类的成员变量
@@ -76,10 +80,16 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
7680 for (TypeElement annotation : annotations ) {
7781 Set <TypeElement > cls = new HashSet <TypeElement >();
7882 Set <? extends Element > elements = roundEnv .getElementsAnnotatedWith (annotation );
83+ Map <TypeElement , Map <String , Object >> map = new HashMap <>();
7984 // 找到都有哪些类里面的方法用到了这个注解
8085 for (Element element : elements ) {
8186 ExecutableElement method = (ExecutableElement ) element ;
8287 TypeElement clz = (TypeElement ) method .getEnclosingElement ();
88+ Map <String , Object > properties = new HashMap <>();
89+ WriteLock anno = method .getAnnotation (WriteLock .class );
90+ properties .put ("fair" , anno .fair ());
91+ if (!map .containsKey (clz ))
92+ map .put (clz , properties );
8393 messager .printMessage (Diagnostic .Kind .NOTE , "发现需要包含注解" + annotation .getQualifiedName () + "的类" + clz .getQualifiedName ());
8494 cls .add (clz );
8595 }
@@ -111,7 +121,7 @@ public void visitClassDef(JCTree.JCClassDecl jcClassDecl) {
111121 // 修改语法树
112122 if (!foundReadWriteLock ) {
113123 messager .printMessage (Diagnostic .Kind .NOTE , "将为类" + clz .getQualifiedName () + "动态生成读写锁" );
114- JCVariableDecl lock = makeReadWriteLock (clz );
124+ JCVariableDecl lock = makeReadWriteLock (clz , map . get ( clz ) );
115125 jcClassDecl .defs = jcClassDecl .defs .append (lock );
116126 }
117127 if (!foundWriteLock ) {
@@ -133,7 +143,7 @@ public void visitClassDef(JCTree.JCClassDecl jcClassDecl) {
133143 * @param clz 要添加锁的类
134144 * @return 读写锁变量声明
135145 */
136- private JCTree .JCVariableDecl makeReadWriteLock (TypeElement clz ){
146+ private JCTree .JCVariableDecl makeReadWriteLock (TypeElement clz , Map < String , Object > properties ){
137147 // 导入包
138148 JCCompilationUnit imports = (JCCompilationUnit ) this .javacTrees .getPath (clz ).getCompilationUnit ();
139149 imports .defs = imports .defs .append (this .treeMaker .Import (this .treeMaker .Select (this .treeMaker .Ident (names .fromString ("java.util.concurrent.locks" )), this .names .fromString ("ReentrantReadWriteLock" )), false ));
@@ -143,7 +153,7 @@ private JCTree.JCVariableDecl makeReadWriteLock(TypeElement clz){
143153 modifiers ,
144154 this .names .fromString ("$lock" ),
145155 this .memberAccess ("java.util.concurrent.locks.ReentrantReadWriteLock" ),
146- this .treeMaker .NewClass (null , nil () , treeMaker .Ident (names .fromString ("ReentrantReadWriteLock" )), nil ( ), null )
156+ this .treeMaker .NewClass (null , of ( memberAccess ( "java.lang.Boolean" )) , treeMaker .Ident (names .fromString ("ReentrantReadWriteLock" )), of ( this . treeMaker . Literal ( properties . get ( "fair" )) ), null )
147157 );
148158 return var ;
149159 }
0 commit comments