如何在自己的API中发出警告信息?

时间:2014-04-22 14:35:52

标签: java eclipse compiler-warnings

是否可以在我自己的API中提供自定义警告消息,如下所示? Resource leak:'ois' is never closed消息是否与Java API或JVM相关?

enter image description here

3 个答案:

答案 0 :(得分:6)

可以使用编译器API。您必须扩展AbstractProcessor,然后确保编译器知道它。

让我们说,我们不喜欢程序员在源代码中发誓。因此,当有人定义名称为#34; 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();
    }
}

你看到同样的警告:

enter image description here

答案 1 :(得分:1)

您可以使用annotation processor创建警告,备注,错误和其他诊断消息。它是JDK中集成的编译器插件api。它可以让您分析源代码的大纲结构。尽管在处理代码时你并不需要处理任何注释。消息是使用Messager类创建的。如果您提供了一个元素,它将被标记,并且消息将在源代码编辑器中显示在它旁边。

您无法在方法或表达式中的元素上显示消息,但仅限于类型,属性,方法或参数等声明。可以使用其他工具另外解析方法体并基于内容生成消息,但据我所知,您无法在实际的本地元素上显示消息。您仍然可以在封闭方法上显示消息,或者根本不指定任何元素并在IDE的日志中显示它。

IDE还需要支持这一点。我知道Eclipse和NetBeans确实支持由注释处理器生成的消息,但也可能有其他现代IDE也这样做。如果您需要更多功能,如方法体内元素的消息或示例中所示的快速修复功能,我想您需要为IDE创建一个插件。

答案 2 :(得分:0)

我相信它与eclipse ide有关,你可以编写一个显示类似警告的插件。

例如,当您使用具有注释&#39; @ Deprecated&#39;的方法时ide自动告诉程序员该方法已被弃用。