Skip to content

Commit c40c62b

Browse files
committed
java/se: add plugin annotation sample
1 parent a7f1e77 commit c40c62b

File tree

24 files changed

+674
-108
lines changed

24 files changed

+674
-108
lines changed

java/javaee/spring-boot/integration/boot-dubbo/readme.md

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -25,29 +25,34 @@
2525
2626
## dubbo
2727
28-
![avatar](https://camo.githubusercontent.com/e11a2ff9575abc290657ba3fdbff5d36f1594e7add67a72e0eda32e449508eef/68747470733a2f2f647562626f2e6170616368652e6f72672f696d67732f6172636869746563747572652e706e67) 0. intros - 底层推荐默认使用 dubbo 协议: [link](https://blog.csdn.net/hjy930226173/article/details/125770252)
29-
30-
1. flow
31-
32-
- 服务容器负责启动, 加载, 运行服务提供者
33-
- 服务提供者在启动时, 向注册中心注册自己提供的服务
34-
- 服务消费者在启动时, 向注册中心订阅自己所需的服务
35-
- 注册中心返回服务提供者地址列表给消费者
36-
1. 如果有变更, 注册中心将基于长连接推送变更数据给消费者
37-
- 服务消费者, 从提供者地址列表中基于软负载均衡算法, 选一台提供者进行调用
38-
1. 如果调用失败, 再选另一台调用
39-
- 服务消费者和提供者, 在内存中累计调用次数和调用时间, 定时每分钟发送一次统计数据到监控中心
40-
41-
2. RPC(Remote Procedure Call): 远程过程调用
42-
43-
- 是一种`通过网络`从远程计算机程序上请求服务, 而不需要了解底层网络技术的协议
44-
- 解决部署在两台机器上的相互调用问题: Http 也可但是性能不好
45-
46-
3. feature
47-
- 负载均衡: 同一个服务部署在不同的机器时该调用那一台机器上的服务
48-
- 服务调用链路生成: 服务之间互相是如何调用的
49-
- 服务访问压力以及时长统计: 当前系统的压力主要在哪里, 如何来扩容和优化
50-
- 服务降级: 某个服务挂掉之后调用备用服务
28+
![avatar](https://camo.githubusercontent.com/e11a2ff9575abc290657ba3fdbff5d36f1594e7add67a72e0eda32e449508eef/68747470733a2f2f647562626f2e6170616368652e6f72672f696d67732f6172636869746563747572652e706e67)
29+
30+
1. intros
31+
- 底层推荐默认使用 dubbo 协议: [link](https://blog.csdn.net/hjy930226173/article/details/125770252)
32+
- dubbo 协议是 TCP 协议上包裹的协议, 采用单一**长连接**和 **NIO 异步**通讯
33+
- 适合场景: 小数据量**大并发**的服务调用 | 消费者数量远大于提供者的情况
34+
35+
2. flow
36+
37+
- 服务容器负责启动, 加载, 运行服务提供者
38+
- 服务提供者在启动时, 向注册中心注册自己提供的服务
39+
- 服务消费者在启动时, 向注册中心订阅自己所需的服务
40+
- 注册中心返回服务提供者地址列表给消费者
41+
1. 如果有变更, 注册中心将基于长连接推送变更数据给消费者
42+
- 服务消费者, 从提供者地址列表中基于软负载均衡算法, 选一台提供者进行调用
43+
1. 如果调用失败, 再选另一台调用
44+
- 服务消费者和提供者, 在内存中累计调用次数和调用时间, 定时每分钟发送一次统计数据到监控中心
45+
46+
3. RPC(Remote Procedure Call): 远程过程调用
47+
48+
- 是一种`通过网络`从远程计算机程序上请求服务, 而不需要了解底层网络技术的协议
49+
- 解决部署在两台机器上的相互调用问题: Http 也可但是性能不好
50+
51+
4. feature
52+
- 负载均衡: 同一个服务部署在不同的机器时该调用那一台机器上的服务
53+
- 服务调用链路生成: 服务之间互相是如何调用的
54+
- 服务访问压力以及时长统计: 当前系统的压力主要在哪里, 如何来扩容和优化
55+
- 服务降级: 某个服务挂掉之后调用备用服务
5156

5257
## reference
5358

Lines changed: 59 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,61 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
3-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4-
<parent>
5-
<artifactId>javase</artifactId>
6-
<groupId>cn.edu.ntu.java</groupId>
7-
<version>1.0-SNAPSHOT</version>
8-
</parent>
9-
<modelVersion>4.0.0</modelVersion>
10-
<artifactId>javase-agent</artifactId>
11-
<build>
12-
<plugins>
13-
<plugin>
14-
<artifactId>maven-jar-plugin</artifactId>
15-
<version>3.1.2</version>
16-
<configuration>
17-
<archive>
18-
<manifestEntries>
19-
<project-name>${project.name}</project-name>
20-
<project-version>${project.version}</project-version>
21-
<Premain-Class>cn.edu.ntu.javase.agent.IntegrationAgent</Premain-Class>
22-
<Can-Redefine-Classes>true</Can-Redefine-Classes>
23-
<Can-Retransform-Classes>true</Can-Retransform-Classes>
24-
<Boot-Class-Path>javassist-3.27.0-GA.jar</Boot-Class-Path>
25-
</manifestEntries>
26-
</archive>
27-
<skip>true</skip>
28-
</configuration>
29-
</plugin>
30-
<plugin>
31-
<artifactId>maven-shade-plugin</artifactId>
32-
<executions>
33-
<execution>
34-
<phase>package</phase>
35-
<goals>
36-
<goal>shade</goal>
37-
</goals>
38-
<configuration>
39-
<transformers>
40-
<transformer/>
41-
</transformers>
42-
</configuration>
43-
</execution>
44-
</executions>
45-
</plugin>
46-
</plugins>
47-
</build>
48-
<dependencies>
49-
<dependency>
50-
<groupId>org.eclipse.jetty.aggregate</groupId>
51-
<artifactId>jetty-all</artifactId>
52-
<version>9.2.11.v20150529</version>
53-
<scope>test</scope>
54-
<exclusions>
55-
<exclusion>
56-
<artifactId>javax.websocket-api</artifactId>
57-
<groupId>javax.websocket</groupId>
58-
</exclusion>
59-
</exclusions>
60-
</dependency>
61-
</dependencies>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3+
<parent>
4+
<artifactId>javase</artifactId>
5+
<groupId>cn.edu.ntu.java</groupId>
6+
<version>1.0-SNAPSHOT</version>
7+
</parent>
8+
<modelVersion>4.0.0</modelVersion>
9+
<artifactId>javase-agent</artifactId>
10+
<build>
11+
<plugins>
12+
<plugin>
13+
<artifactId>maven-jar-plugin</artifactId>
14+
<version>3.1.2</version>
15+
<configuration>
16+
<archive>
17+
<manifestEntries>
18+
<project-name>${project.name}</project-name>
19+
<project-version>${project.version}</project-version>
20+
<Premain-Class>cn.edu.ntu.javase.agent.IntegrationAgent</Premain-Class>
21+
<Can-Redefine-Classes>true</Can-Redefine-Classes>
22+
<Can-Retransform-Classes>true</Can-Retransform-Classes>
23+
<Boot-Class-Path>javassist-3.27.0-GA.jar</Boot-Class-Path>
24+
</manifestEntries>
25+
</archive>
26+
<skip>true</skip>
27+
</configuration>
28+
</plugin>
29+
<plugin>
30+
<artifactId>maven-shade-plugin</artifactId>
31+
<executions>
32+
<execution>
33+
<phase>package</phase>
34+
<goals>
35+
<goal>shade</goal>
36+
</goals>
37+
<configuration>
38+
<transformers>
39+
<transformer />
40+
</transformers>
41+
</configuration>
42+
</execution>
43+
</executions>
44+
</plugin>
45+
</plugins>
46+
</build>
47+
<dependencies>
48+
<dependency>
49+
<groupId>org.eclipse.jetty.aggregate</groupId>
50+
<artifactId>jetty-all</artifactId>
51+
<version>9.2.11.v20150529</version>
52+
<scope>test</scope>
53+
<exclusions>
54+
<exclusion>
55+
<artifactId>javax.websocket-api</artifactId>
56+
<groupId>javax.websocket</groupId>
57+
</exclusion>
58+
</exclusions>
59+
</dependency>
60+
</dependencies>
6261
</project>
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
3+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>javase</artifactId>
7+
<groupId>cn.edu.ntu.java</groupId>
8+
<version>1.0-SNAPSHOT</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>javase-annotation-processor</artifactId>
13+
14+
<dependencies>
15+
<!--
16+
<dependency>
17+
<groupId>com.sun</groupId>
18+
<artifactId>tools</artifactId>
19+
<version>${compiler.level}</version>
20+
<scope>system</scope>
21+
<systemPath>${java.home}/../lib/tools.jar</systemPath>
22+
</dependency>
23+
-->
24+
<dependency>
25+
<groupId>org.frgaal</groupId>
26+
<artifactId>compiler</artifactId>
27+
<version>14.0.2</version>
28+
</dependency>
29+
</dependencies>
30+
31+
<build>
32+
<plugins>
33+
<plugin>
34+
<groupId>org.apache.maven.plugins</groupId>
35+
<artifactId>maven-compiler-plugin</artifactId>
36+
<configuration>
37+
<source>1.8</source>
38+
<target>1.8</target>
39+
<encoding>UTF-8</encoding>
40+
<!-- 不加这一句编译会报找不到 processor 的异常-->
41+
<proc>none</proc>
42+
</configuration>
43+
</plugin>
44+
</plugins>
45+
</build>
46+
</project>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package cn.edu.ntu.java.annotation;
2+
3+
import cn.edu.ntu.java.processor.DataProcessor;
4+
5+
import java.lang.annotation.ElementType;
6+
import java.lang.annotation.Retention;
7+
import java.lang.annotation.RetentionPolicy;
8+
import java.lang.annotation.Target;
9+
10+
/**
11+
* @see DataProcessor
12+
* @author alice52
13+
*/
14+
@Target({ElementType.TYPE})
15+
@Retention(RetentionPolicy.SOURCE)
16+
public @interface SeData {
17+
}
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package cn.edu.ntu.java.processor;
2+
3+
import cn.edu.ntu.java.annotation.SeData;
4+
import com.sun.source.tree.Tree;
5+
import com.sun.tools.javac.api.JavacTrees;
6+
import com.sun.tools.javac.code.Flags;
7+
import com.sun.tools.javac.code.Type;
8+
import com.sun.tools.javac.processing.JavacProcessingEnvironment;
9+
import com.sun.tools.javac.tree.JCTree;
10+
import com.sun.tools.javac.tree.TreeMaker;
11+
import com.sun.tools.javac.tree.TreeTranslator;
12+
import com.sun.tools.javac.util.*;
13+
14+
import javax.annotation.processing.*;
15+
import javax.lang.model.SourceVersion;
16+
import javax.lang.model.element.TypeElement;
17+
import java.util.Set;
18+
19+
/**
20+
* 该代码使用 jdk 8u20 编译会有bug ,bug详情参见:https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8062747
21+
*
22+
* @author : alice52
23+
* @date : 2020/1/10
24+
*/
25+
@SupportedAnnotationTypes("cn.edu.ntu.java.annotation.SeData")
26+
@SupportedSourceVersion(SourceVersion.RELEASE_8)
27+
public class DataProcessor extends AbstractProcessor {
28+
private JavacTrees trees;
29+
private TreeMaker treeMaker;
30+
private Names names;
31+
32+
@Override
33+
public synchronized void init(ProcessingEnvironment processingEnv) {
34+
super.init(processingEnv);
35+
this.trees = JavacTrees.instance(processingEnv);
36+
Context context = ((JavacProcessingEnvironment) processingEnv).getContext();
37+
this.treeMaker = TreeMaker.instance(context);
38+
this.names = Names.instance(context);
39+
}
40+
41+
@Override
42+
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
43+
roundEnv.getElementsAnnotatedWith(SeData.class).stream()
44+
.map(element -> trees.getTree(element))
45+
.forEach(jcTree -> jcTree.accept(new TreeTranslator() {
46+
@Override
47+
public void visitClassDef(JCTree.JCClassDecl jcClassDecl) {
48+
jcClassDecl.defs.stream().filter(jcTree1 -> jcTree1.getKind().equals(Tree.Kind.VARIABLE))
49+
.map(jcTree2 -> (JCTree.JCVariableDecl) jcTree2)
50+
.forEach(jcVariableDecl -> {
51+
//添加get方法
52+
jcClassDecl.defs = jcClassDecl.defs.prepend(addGetterMethod(jcVariableDecl));
53+
//添加set方法
54+
jcClassDecl.defs = jcClassDecl.defs.prepend(addSetterMethod(jcVariableDecl));
55+
});
56+
57+
super.visitClassDef(jcClassDecl);
58+
}
59+
}));
60+
return true;
61+
}
62+
63+
64+
/**
65+
* 创建get方法
66+
*
67+
* @param jcVariableDecl
68+
* @return
69+
*/
70+
private JCTree.JCMethodDecl addGetterMethod(JCTree.JCVariableDecl jcVariableDecl) {
71+
//方法的访问级别
72+
JCTree.JCModifiers modifiers = treeMaker.Modifiers(Flags.PUBLIC);
73+
//方法名称
74+
Name methodName = getMethodName(jcVariableDecl.getName());
75+
//设置返回值类型
76+
JCTree.JCExpression returnMethodType = jcVariableDecl.vartype;
77+
ListBuffer<JCTree.JCStatement> statements = new ListBuffer<>();
78+
statements.append(treeMaker.Return(treeMaker.Select(treeMaker.Ident(names.fromString("this")), jcVariableDecl.getName())));
79+
//设置方法体
80+
JCTree.JCBlock methodBody = treeMaker.Block(0, statements.toList());
81+
List<JCTree.JCTypeParameter> methodGenericParams = List.nil();
82+
List<JCTree.JCVariableDecl> parameters = List.nil();
83+
List<JCTree.JCExpression> throwsClauses = List.nil();
84+
//构建方法
85+
return treeMaker.MethodDef(modifiers, methodName, returnMethodType, methodGenericParams, parameters, throwsClauses, methodBody, null);
86+
}
87+
88+
/**
89+
* 创建set方法
90+
*
91+
* @param jcVariableDecl
92+
* @return
93+
*/
94+
private JCTree.JCMethodDecl addSetterMethod(JCTree.JCVariableDecl jcVariableDecl) {
95+
try {
96+
//方法的访问级别
97+
JCTree.JCModifiers modifiers = treeMaker.Modifiers(Flags.PUBLIC);
98+
//定义方法名
99+
Name methodName = setMethodName(jcVariableDecl.getName());
100+
//定义返回值类型
101+
JCTree.JCExpression returnMethodType = treeMaker.Type((Type) (Class.forName("com.sun.tools.javac.code.Type$JCVoidType").newInstance()));
102+
ListBuffer<JCTree.JCStatement> statements = new ListBuffer<>();
103+
statements.append(treeMaker.Exec(treeMaker.Assign(treeMaker.Select(treeMaker.Ident(names.fromString("this")), jcVariableDecl.getName()), treeMaker.Ident(jcVariableDecl.getName()))));
104+
//定义方法体
105+
JCTree.JCBlock methodBody = treeMaker.Block(0, statements.toList());
106+
List<JCTree.JCTypeParameter> methodGenericParams = List.nil();
107+
//定义入参
108+
JCTree.JCVariableDecl param = treeMaker.VarDef(treeMaker.Modifiers(Flags.PARAMETER, List.nil()), jcVariableDecl.name, jcVariableDecl.vartype, null);
109+
//设置入参
110+
List<JCTree.JCVariableDecl> parameters = List.of(param);
111+
List<JCTree.JCExpression> throwsClauses = List.nil();
112+
//构建新方法
113+
return treeMaker.MethodDef(modifiers, methodName, returnMethodType, methodGenericParams, parameters, throwsClauses, methodBody, null);
114+
} catch (IllegalAccessException e) {
115+
e.printStackTrace();
116+
} catch (InstantiationException e) {
117+
e.printStackTrace();
118+
} catch (ClassNotFoundException e) {
119+
e.printStackTrace();
120+
}
121+
return null;
122+
}
123+
124+
private Name getMethodName(Name name) {
125+
String s = name.toString();
126+
return names.fromString("get" + s.substring(0, 1).toUpperCase() + s.substring(1, name.length()));
127+
}
128+
129+
130+
private Name setMethodName(Name name) {
131+
String s = name.toString();
132+
return names.fromString("set" + s.substring(0, 1).toUpperCase() + s.substring(1, name.length()));
133+
}
134+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
cn.edu.ntu.java.processor.DataProcessor

java/javase/javase-annotation/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,11 @@
1717
<artifactId>javase-common</artifactId>
1818
<version>${project.version}</version>
1919
</dependency>
20+
21+
<dependency>
22+
<groupId>cn.edu.ntu.java</groupId>
23+
<artifactId>javase-annotation-processor</artifactId>
24+
<version>${project.version}</version>
25+
</dependency>
2026
</dependencies>
2127
</project>

0 commit comments

Comments
 (0)