如何在自己的API中给出警告消息?
是否可以在我自己的API中提供自定义警告消息,如下所示?消息是否与 Java API 或 JVM 相关?Resource leak:'ois' is never closed
是否可以在我自己的API中提供自定义警告消息,如下所示?消息是否与 Java API 或 JVM 相关?Resource leak:'ois' is never closed
可以使用编译器 API。你必须扩展一个抽象处理器,然后确保编译器知道它。
假设我们不喜欢程序员在源代码中发誓。因此,当有人定义一个名为“shit”的字段时,我们希望显示警告。下面是一个简单的实现:
import java.util.List;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic.Kind;
@SupportedSourceVersion(SourceVersion.RELEASE_7)
@SupportedAnnotationTypes("*")
public class Test extends AbstractProcessor {
public int shit;
public int foo;
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
Set<? extends Element> rootElements = roundEnv.getRootElements();
for (Element element : rootElements) {
if (element.getKind() == ElementKind.CLASS) {
List<? extends Element> classElements = element.getEnclosedElements();
for (Element classElement : classElements) {
if (classElement.getKind() == ElementKind.FIELD) {
if (classElement.getSimpleName().contentEquals("shit")) {
processingEnv.getMessager().printMessage(
Kind.WARNING,
"How dare you to swear in the source code?!",
classElement
);
}
}
}
}
}
return false;
}
public static void main(String[] args) {
//
}
}
现在,我们想要为这个类应用这样的处理器,因为还有一个丑陋的坏名称字段。
使用命令行:
javac Test.java
javac -processor Test Test.java
我们需要首先构建一个处理器,然后在编译时应用它(在本例中为同一文件)。
这是我们得到的输出:
Test.java:17: warning: How dare you to swear in the source code?!
public int shit;
^
1 warning
要在 Eclipse 或任何其他 IDE 中出现相同的警告,必须更改编译器设置,使其使用此自定义处理器。
更新:在评论中,kapep发送了一个关于如何在Eclipse中设置自定义处理器的链接:http://kerebus.com/2011/02/using-java-6-processors-in-eclipse/
只是为了记录:通过实现接口Closeable可以实现完全相同的警告:
import java.io.Closeable;
import java.io.IOException;
public class Test implements Closeable {
@Override
public void close() throws IOException {
// TODO Auto-generated method stub
}
public static void main(String[] args) {
new Test();
}
}
您会看到相同的警告:
您可以使用注释处理器创建警告、注释、错误和其他类似诊断消息。它是集成在JDK中的编译器插件API。它允许您分析源代码的大纲结构。尽管有这个名字,但在处理代码时,你并不需要处理任何注释。消息是使用 Messager 类创建的。如果您提供了一个元素,它将被标记,并且在源代码编辑器中,消息将显示在它旁边。
但是,您将无法在方法或表达式中的元素上显示消息,只能显示类型,属性,方法或参数等声明的消息。可以使用其他工具额外解析方法主体并根据内容生成消息,但据我所知,您无法在实际的本地元素上显示消息。您仍然可以在封闭方法上显示消息,或者根本不指定任何元素并将其显示在 IDE 的日志中。
IDE 还需要支持此功能。我知道 Eclipse 和 NetBeans 确实支持注释处理器生成的消息,但可能还有其他现代 IDE 也支持这样做。如果您需要更多功能,例如方法体内元素的消息或示例中所示的快速修复功能,我想您需要为IDE创建一个插件。