Как намеренно вызвать пользовательское сообщение предупреждения компилятора Java?

Windows Job Objects походит на хорошее место для запуска. Название Объекта Задания должно было бы быть известным, или передало детям (или наследуйте дескриптор). Дети должны были бы быть уведомлением, когда родитель умирает, или через обанкротившуюся IPC "heartbeat" или просто через WFMO/WFSO на дескрипторе процесса родителя. В той точке любой дочерний процесс мог TermianteJobObject для перевода в нерабочее состояние целой группы.

74
задан pimlottc 18 November 2009 в 00:29
поделиться

5 ответов

Один метод, который я видел, - это привязка его к модульному тестированию (вы выполняете модульное тестирование, верно?). Обычно вы создаете модульный тест, который завершается ошибкой , как только исправление внешнего ресурса достигнуто. Затем вы комментируете этот модульный тест, чтобы рассказать другим, как отменить ваш грубый взлом, как только проблема будет решена.

Что действительно хорошо в этом подходе, так это то, что триггером для отмены вашего взлома является исправление самой основной проблемы.

37
ответ дан 24 November 2019 в 11:55
поделиться

как насчет того, чтобы пометить метод или класс как @Deprecated? здесь . Обратите внимание, что есть как @Deprecated, так и @deprecated - заглавная версия D является аннотацией, а строчная d - версией javadoc. Версия javadoc позволяет вам указать произвольную строку, объясняющую, что происходит. Но компиляторы не обязаны выдавать предупреждение при его просмотре (хотя многие это делают). Аннотации всегда должны вызывать предупреждение, хотя я не думаю, что вы можете добавить к ней пояснения.

ОБНОВЛЕНИЕ. Это код, который я только что тестировал: Sample.java содержит:

public class Sample {
    @Deprecated
    public static void foo() {
         System.out.println("I am a hack");
    }
}

SampleCaller.java содержит:

public class SampleCaller{
     public static void main(String [] args) {
         Sample.foo();
     }
}

когда я запускаю "javac Sample.java SampleCaller.java", я получаю следующий результат:

Note: SampleCaller.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

Я использую sun javac 1.6. Если вы хотите получить честное предупреждение, а не просто примечание, используйте параметр -Xlint. Может быть, это должным образом пройдет через Ant.

5
ответ дан 24 November 2019 в 11:55
поделиться

Здесь показывает руководство по аннотациям, а внизу - пример определения ваших собственных аннотации. К сожалению, беглый просмотр учебника показал, что они доступны только в javadoc ...

Аннотации, используемые компилятором Есть три типа аннотаций которые предопределены самой спецификацией языка: @Deprecated, @Override, and @SuppressWarnings.

So it appears that all you can really do is throw in an @Deprecated tag that the compiler will print out or put a custom tag in the javadocs that tells about the hack.

2
ответ дан 24 November 2019 в 11:55
поделиться

You should use a tool to compile, like ant ou maven. With it, you should define some tasks at compile time which could produce some logs (like messages or warnings) about your FIXME tags, for example.

And if you want some errors, it is possible too. Like stop compilation when you have left some TODO in your code (why not ?)

0
ответ дан 24 November 2019 в 11:55
поделиться

Я думаю, что специальная аннотация, которая будет обработана компилятором, является решением. Я часто пишу собственные аннотации, чтобы делать что-то во время выполнения, но никогда не пробовал использовать их во время компиляции. Итак, я могу дать вам только указатели на инструменты, которые могут вам понадобиться:

  • Напишите собственный тип аннотации. На этой странице объясняется, как написать аннотацию.
  • Напишите процессор аннотаций, который обрабатывает ваши пользовательские аннотации для выдачи предупреждения. Инструмент, который запускает такие обработчики аннотаций, называется APT. Вы можете найти введение на этой странице . Я думаю, что вам нужен APT API, это AnnotationProcessorEnvironment, который позволит вам выдавать предупреждения.
  • Начиная с Java 6, APT интегрирован в javac. То есть вы можете добавить обработчик аннотаций в командную строку javac. Этот раздел руководства javac расскажет вам, как вызвать ваш пользовательский процессор аннотаций.

Я не знаю, реально ли это решение. Я постараюсь реализовать это сам, когда найду время.

Edit

Я успешно реализовал свое решение. И в качестве бонуса я использовал возможность поставщика услуг java, чтобы упростить его использование. Фактически, мое решение представляет собой банку, содержащую 2 класса: пользовательскую аннотацию и обработчик аннотации. Чтобы использовать это, просто добавьте эту банку в путь к классам вашего проекта и аннотируйте все, что хотите! Это нормально работает внутри моей IDE (NetBeans).

Код аннотации:

package fr.barjak.hack;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.LOCAL_VARIABLE, ElementType.METHOD, ElementType.PACKAGE, ElementType.PARAMETER, ElementType.TYPE})
public @interface Hack {

}

Код процессора:

package fr.barjak.hack_processor;

import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic.Kind;

@SupportedAnnotationTypes("fr.barjak.hack.Hack")
public class Processor extends AbstractProcessor {

    private ProcessingEnvironment env;

    @Override
    public synchronized void init(ProcessingEnvironment pe) {
        this.env = pe;
    }

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        if (!roundEnv.processingOver()) {
            for (TypeElement te : annotations) {
                final Set< ? extends Element> elts = roundEnv.getElementsAnnotatedWith(te);
                for (Element elt : elts) {
                    env.getMessager().printMessage(Kind.WARNING,
                            String.format("%s : thou shalt not hack %s", roundEnv.getRootElements(), elt),
                            elt);
                }
            }
        }
        return true;
    }

}

Чтобы включить полученный jar-файл в качестве поставщика услуг, добавьте файл META-INF /services/javax.annotation.processing.Processor в банке. Это файл acsii, который должен содержать следующий текст:

fr.barjak.hack_processor.Processor
85
ответ дан 24 November 2019 в 11:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: