Ответ 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();
}
}
И вы увидите одно и то же предупреждение: