方法参数的java编译时验证
我在这里发现了一些类似的问题,但是不完整的答案没有帮助,并且产生了比澄清任何问题更多的混乱,因此我尝试给出一个更结构化的问题,并希望得到能够帮助更多用户的答案
我的简化示例:我有一个带有两个不同构造函数的Java类
public class ObjectOfInterest {
public ObjectOfInterest(String string, Integer int) { ... }
public ObjectOfInterest(String string1, String string2) { ... }
...
}
我需要对这些构造函数的调用进行编译时验证。参数string2
必须是某个文本,我想根据内容将调用标记为警告(即,如果不是文本或文本格式不正确,则给出警告)
不幸的是,用Eclipse在Java中进行验证的文档不容易理解,有时已经过时,在我看来,大多数情况下都是不完整的,而且似乎没有足够短的工作示例可以在教程中使用
我的目标: 第一步:我希望有一个验证器,用一个警告标记两个参数版本的调用-只是从某个地方开始,了解基本知识
到目前为止我所发现的:
我所看到的几个例子使public class MyValidator implements IValidator, ISourceValidator
成为IValidator
需要实现一个方法public void validate(IValidationContext arg0, IReporter arg1) throws ValidationException
,并且似乎来自旧版本的验证框架(有时我发现只有带有注释的空方法无用),而ISourceValidator
需要实现一个方法public void validate(IRegion arg0, IValidationContext arg1, IReporter arg2)
-这似乎是更为最新的版本
然后您必须向一些plugin.xml
添加一些扩展点(我不完全清楚这个plugin.xml在哪里)
我在黑暗中刺向何处:完全不清楚如何使用IRegion
、IValidationContext
和IReporter
-也许我走错了路,但我在这里得到了什么?如何在验证中找到该构造函数的调用
在第一步变得更清楚之后,我会扩展这个问题。Outlook,我想为构造函数的两个字符串版本添加快速修复的可能性,并以这种方式操作代码-但这至少提前了两步,详细信息将在后面介绍
# 1 楼答案
我想尝试一下Java注释处理器,它在
JDK-5
中引入,并在JSR-269
规范下的JDK-6
中标准化需要对文件(java
@interfaces
)进行注释,这些文件应该根据使用自定义注释的规则进行验证。如果无法对每个文件进行注释,则必须对包含要验证的类的包进行注释(也可以对内部包进行迭代)。下面的示例将演示如何使用注释类和注释处理器验证类。我已将示例项目上载到github存储库中。请在githubhttps://github.com/hjchanna/compile_validation_java上查看项目存储库步骤01:创建注释接口(
@interface
)步骤02:创建
Processor
类,该类将编译验证规则引入编译器处理器类应该从
javax.annotation.processing.AbstractProcessor
开始extend
,并且应该用@SupportedAnnotationTypes
和@SupportedSourceVersion
注释对其进行注释。请根据确切的要求或验证规则修改CompileValidationProcessor
类步骤03:创建处理服务链接文件
然后需要将名为
javax.annotation.processing.Processor
的类添加到项目的资源路径(/src/main/resources/META-INF/services
)中。该文件仅包含Processor
的类名。根据前面的示例,配置文件的内容如下所示前面的方法适用于maven项目。如果需要,可以将配置文件手动注入到输出
.jar
文件的META-INF/services
文件夹中步骤04:禁用当前项目的验证
禁用当前项目的注释处理。如果启用它,它将无法生成当前项目,因为编译器试图定位要验证的
Processor
类。但它仍然没有被编译。因此,它将因自身原因而无法建设该项目。将以下代码添加到pom.xml
(在<build> -> <plugin>
内)是时候测试这个项目了。使用以前创建的自定义注释(
CompileValidation
)注释所需的类。如果无法验证带注释的类,它将显示警告。我的输出如下PMD
,这是一个java源代码扫描程序。它提供了使用xml配置定义规则的方法李>Java Instrumentation API
,但如果应用程序违反规则,唯一可能的反应是使其崩溃。这不是一个好的做法李># 2 楼答案
首先,我必须说,您试图的内容超出了普通Java编程的范围。除了使用普通类型可以实现的功能外,在编译时没有正常的方法进行验证
您想要做的事情也超出了使用注释处理器所能做的事情。注释处理器是半正常的,因为它们是标准化的,并且是Java框架的一部分。它们是在编译过程中运行的类,它们获得类和方法的签名作为输入,并可用于验证和代码生成
如果仍要执行此操作,则会出现异常方法,但是:
Eclipse插件解决方案
您似乎正在尝试的解决方案是编写一个使用EclipseJava工具进行验证的Eclipse插件。这应该是可行的,我不知道这有多容易,验证只对使用Eclipse的用户有效
检查器解决方案
根据我(有限)的知识,似乎最好的工具是:
用于静态分析的Checker Framework
它被用来做你想做的事情。它似乎有很好的文档记录,并且易于设置。例如,它用于对正则表达式语法进行空性分析和编译时验证。有一个tutorial听起来很像你的东西。手册中有一章是关于creating a new checker的
使用它可能需要花费大量的时间和精力来制定一个解决方案,但我也认为它看起来非常有趣