Как дать предупреждение в собственном API?

Возможно ли предоставить настраиваемое предупреждающее сообщение в моем собственном API, как показано ниже? Сообщение Resource leak:'ois' is never closed, связанное с Java API или JVM?

enter image description here

Ответы

Ответ 1

Возможно использование API компилятора. Вы должны расширить AbstractProcessor, а затем убедиться, что компилятор знает об этом.

Давайте скажем, что мы не любим программистов ругаться в исходном коде. Итак, когда кто-то определяет поле с именем "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

Ответ 2

Вы можете создавать предупреждения, заметки, ошибки и другие диагностические сообщения, например, с помощью аннотационного процессора. Это компилятор-плагин api, встроенный в JDK. Он позволяет анализировать структуру структуры исходного кода. Несмотря на название, вам не нужно обрабатывать какие-либо аннотации при обработке кода. Сообщения создаются с использованием класса Messager. Если вы предоставите элемент, он будет помечен и сообщение будет показано рядом с ним в редакторе исходного кода.

Вы не сможете показывать сообщение о элементах внутри методов или выражений, но только в таких объявлениях, как типы, свойства, методы или параметры. Можно дополнительно проанализировать тело метода и генерировать сообщения на основе контента с использованием других инструментов, но насколько я знаю, вы не можете показать сообщение на фактическом локальном элементе. Вы все равно можете показать сообщение в приложении или не указывать какой-либо элемент вообще и показать его в журнале IDE.

IDE также должна поддерживать это. Я знаю, что Eclipse и NetBeans поддерживают сообщения, созданные обработчиками аннотаций, но, вероятно, есть и другие современные среды IDE. Если вам нужно больше функций, таких как сообщения на элементах внутри тела методов или функция быстрого исправления, как показано в примере, я думаю, вам нужно создать плагин для IDE.

Ответ 3

Я бы поверила, что это связано с идеей eclipse, вы могли бы написать плагин, который отображает такие предупреждения.

Например, когда вы используете метод, который содержит аннотацию "@Deprecated", ide автоматически сообщает программисту, что метод устарел.