Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Выполнить код во время компиляции программы


Автор: Karadul 9.4.2013, 05:44
Можно ли, во время компиляции проверить, например, валидный ли регексп/url?

Автор: Killer_13 9.4.2013, 09:41
Если я не ошибаюсь, то нужно смотреть в сторону Reflection.

Автор: Stolzen 9.4.2013, 10:24
Возможно, можно применить тот же подход, который используется в Project Lombok

http://notatube.blogspot.co.uk/2010/11/project-lombok-trick-explained.html

Автор: Karadul 9.4.2013, 18:27
Цитата(Stolzen @  9.4.2013,  10:24 Найти цитируемый пост)
Возможно, можно применить тот же подход, который используется в Project Lombok

http://notatube.blogspot.co.uk/2010/11/pro...-explained.html 

Нде, а как это использовать?

Автор: Stolzen 10.4.2013, 09:57
Ну мне кажется, что можно повесить хук, и во время компиляции каким-либо образом пройтись по AST дереву и для строк, если там регулярки, проверить их. 
Естественно, логичнее будет при этом помечать каким-то образом строки с регулярками, например, аннотацией. 

Автор: Karadul 10.4.2013, 10:27
А пример есть какой-то, или проще эту идею оставить?

Автор: LSD 10.4.2013, 10:34
http://habrahabr.ru/post/88908/

Автор: Karadul 10.4.2013, 11:56
И что там? Как использовать аннотации? А как туда прикрутить проверку во время компиляции и как кидать ошибки?

Автор: LSD 10.4.2013, 13:04
Цитата(Karadul @  10.4.2013,  12:56 Найти цитируемый пост)
И что там? Как использовать аннотации? А как туда прикрутить проверку во время компиляции и как кидать ошибки?

Тебе стоит задуматься над сменой профессии, например клининг-оператор.

Автор: Karadul 10.4.2013, 14:13
Я просто не профессиональный жавалюб. А вот смотря на тебя, диву даешься, каким чепушилам модерку дают.

Автор: LSD 10.4.2013, 14:19
Цитата(Karadul @  10.4.2013,  15:13 Найти цитируемый пост)
Я просто не профессиональный жавалюб.

Ты в принципе не профессионал, ты не может ни документацию прочесть, ни код написать. Только на хамиство тебя и хватает.

Автор: Karadul 10.4.2013, 14:48
Цитата(LSD @  10.4.2013,  14:19 Найти цитируемый пост)
Ты в принципе не профессионал, ты не может ни документацию прочесть, ни код написать. Только на хамиство тебя и хватает. 

А помойму, это ты - хам, да еще и с модеркой.

Я лишь спросил, нет ли чего-нибудь, с чем попроще разобраться.

"В принципе не профессионал" - мосье знает, чем я занимаюсь? Или слово "профессионал" зарезервировали для себя жавалюбы?

Автор: LSD 10.4.2013, 15:18
Цитата(Karadul @  10.4.2013,  15:48 Найти цитируемый пост)
Я лишь спросил, нет ли чего-нибудь, с чем попроще разобраться.

Ты спросил
Цитата(Karadul @  10.4.2013,  11:27 Найти цитируемый пост)
А пример есть какой-то, или проще эту идею оставить?

А когда я тебе дал ссылку на пример, ты заявил:
Цитата(Karadul @  10.4.2013,  12:56 Найти цитируемый пост)
И что там? Как использовать аннотации?

Сразу видно, что ты внимательно все прочитал и разобрался.



Цитата(Karadul @  10.4.2013,  15:48 Найти цитируемый пост)
"В принципе не профессионал" - мосье знает, чем я занимаюсь?

Ты занимаешься явно не своим делом.

Автор: Karadul 10.4.2013, 15:28
Цитата(LSD @  10.4.2013,  15:18 Найти цитируемый пост)
Ты занимаешься явно не своим делом. 

И чем я занимаюсь и какое же мое дело?

Интересно, тебя сюда зудеть поставили или ты это добровольно делаешь? 

Автор: LSD 10.4.2013, 15:30
Цитата(Karadul @  10.4.2013,  16:28 Найти цитируемый пост)
И чем я занимаюсь

Пытаешь программировать, это явно не твое призвание.

Добавлено через 29 секунд
Цитата(Karadul @  10.4.2013,  16:28 Найти цитируемый пост)
Интересно, тебя сюда зудеть поставили или ты это добровольно делаешь?

Уговорил, завязываем.

Автор: jk1 10.4.2013, 23:50
Если среди этого накала страстей кому-то еще интересна техническая сторона вопроса, то вот вариант на базе anootation processor'а:

Сначала создадим marker-аннотацию

Код

package processor;

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

@Target(ElementType.FIELD)
public @interface CheckMyRegexp {
}


и процессор к ней

Код

package processor;

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import java.util.Collections;
import java.util.Set;
import java.util.regex.Pattern;

@SupportedSourceVersion(SourceVersion.RELEASE_6)
public class CheckMyRegexpProcessor extends AbstractProcessor {

    @Override
    public Set<String> getSupportedAnnotationTypes() {
        return Collections.singleton(CheckMyRegexp.class.getName());
    }

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment env) {
        for (TypeElement element : annotations) {
            for (Element el : env.getElementsAnnotatedWith(element)) {
                if (el.getKind().isField()) {
                    Object value = ((VariableElement) el).getConstantValue();
                    Pattern.compile(value.toString());
                }
            }
        }
        //as we do not need any further processing
        return true;
    }
}


Теперь упакуем это в JAR и добавим в него файл /META-INF/services/javax.annotation.processing.Processor со следующим содержимым

Код

processor.CheckMyRegexpProcessor


на самом деле это просто полное имя нашего процессора аннотаций с пакетами.

Теперь процессор готов и его можно подключать его к проектам, в которых мы хотим проверять Regexp'ы на валидность, например так:

Код

package application;

import processor.CheckMyRegexp;

public class Sample {

    @CheckMyRegexp
    private static final String regexp = "[[abc]";
}


если мы сделали все правильно и JAR с процессором есть в classpath, то компиляция файла пройдет только если regexp является валидным.
Для наглядности приаттачу проект, где все собирается мавеном.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)