用AI写了个生成多行字符串的工具

用AI写了个生成多行字符串的工具

https://images.unsplash.com/photo-1547042591-aae98619aab5?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb

在编程中,很多时候我们需要处理多行文本,例如读取文件内容、构建HTML或XML等,而多行字符串的需求一直都存在。使用多行字符串可以轻松地在代码中嵌入多行文本,使得代码更加清晰易懂。因此,多行字符串是非常实用的编程工具之一。

Java中的多行字符串特性要JDK 15+,这可能会对一些项目造成限制。网上也找了也有一些解决方案,链接附在末尾。

multiline-string这个思路也有点意思,但是不支持Java 11。于是就决定自己也写一个看看。

prompt: 写一个Java javax.annotation.processing.Processor例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 定义注解
@Retention(RetentionPolicy.SOURCE)
public @interface Hello {
}

// 实现 Processor
@SupportedAnnotationTypes({"in.code123.Hello"})
public class HelloProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
// 扫描 Hello 注解
for (Element elem : roundEnv.getElementsAnnotatedWith(Hello.class)) {
// 生成代码
processingEnv.getFiler().generateJavaFile(elem);
}
// 返回 true 表示成功处理
return true;
}
}

例子基本上把框架写了出来,但有不少胡说八道的成分。比如凭空造了一个 generateJavaFile 方法。但是这个是关键,我开始想在原类中直接修改变量的值,或者增加一个方法,中间AI推荐JavaPoet类库,asm的类库,但是最终都没有搞定。希望有经验的朋友不吝赐教。

最后退而求其次,决定生成一个新的类,然后再静态导入方法。

1
2
3
4
5
6
7
8
9
10
11
12
import static io.code123.MultilineUtils.*;

...
/**
* SELECT * FROM user
* WHERE ID = ?
*/
@Multiline
String queryUser;
...

System.out.println("queryUser" + queryUser());

**TIPS:**记录过程中的几个tips。

  1. processingEnv.getElementUtils().``getDocComment(element) 可以取到字段或者类的注释,不包含 /** 等字符
  2. 在构建过程process方法可能会多次调用到,导致最后processingEnv.getFiler().createSourceFile("io.code123.MultilineUtils") 方法时候会报重复创建的错误。具体为什么会多次调用也还不清楚,第一次会传入一个空的elements列表。

https://github.com/adrianwalker/multiline-string

Java 8 multiline string example - Softhints