我有一个项目来记录一个非常大的项目中的所有端点。我只有源文件,所以我不能在上面运行某种文档工具。我唯一的资源(据我所知)是带有 perl 或 python 或类似东西的正则表达式。
下面是方法注释的示例:
/**
* Method Javadoc
*/
@Endpoint
@POST
@Path("path/{objectid}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@TypeHint(SomeObject.class)
public Response deleteObject(@PathParam("objectid") Integer objectid) {
//method code
}
我相信我唯一可以相信的是一致的是每个端点方法都会有 @Endpoint
注释。它可能是也可能不是第一个注释。这些方法可以有任何签名。
任何有关正则表达式的帮助都会很棒。我预计它需要的不仅仅是一个正则表达式来匹配所有这些信息,所以一些 python , perl ,甚至 javascript也会有帮助的!
只是为了让您知道我要做什么(我不希望您为我做这项工作,我主要是在寻求有关正则表达式的帮助),我想要的是一个 csv 与以下构造:
SourceFile.java | MethodName | Path | Method | QueryParams | FormParams | Consumes | Produces | ReturnedObject
ClassName.java | deleteObject | path/{objectid} | POST | objectid, | | MediaType.APPLICATION_JSON | {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML} | SomeObject.class
最佳答案
您认为正则表达式是您唯一的解决方案吗? 假设您已经编译了代码(或可以编译它),并且零售了您之后的注释,您可以编写一个遍历所有类的 java 方法,使用 class.forName() 加载它们,然后您有一个各种反射 API 供您使用,以检查类、方法、字段等上的注释。
如果类不一致,您只需在运行时将 jar 添加到类路径中,然后使用 ZipInputStream 打开它,遍历条目,然后使用 class.forName() 将它们一个一个地加载。如果它“爆炸”(只是一堆 *.class 文件),你的工作就更容易了。
检查一个 zip(*.jar、*.ear、*.war 是)是这样的:
ZipInputStream zis = new ZipInputStream(new FileInputStream("fileName"));
ZipEntry entry;
while ((entry = zis.getNextEntry())!=null) {
if (entry.isDirectory()) {
continue;
}
if (!entry.getName().endsWith(".class")) {
continue;
}
Class theClass = Class.forName(entry.getName());
Endpoint targetAnnotation = theClass.getAnnotation(Endpoint.class);
if (targetAnnotation == null) {
continue;
}
//probably what youre looking for
}
当然,您的程序需要在 Class.forName()
调用的执行路径上使用目标 *.war/jar/ear 来执行。如果编译后的代码没有被破坏,那么您可以简单地以非常相似的方式遍历文件系统。
如果您所追求的注解在编译后没有保留,您可能会考虑引入一个可以读取 Java 代码并遍历语法树的库,例如 this
关于java - 正则表达式 Java 端点注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15211284/