2014-12-24 2 views
0

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

public class A{          //1 
                //2 
    int line; // maybe some modifiers if required //3 
                //4 
    public void method1(){       //5 
     System.out.println(line);     //6 
    }            //7 
                //8 
    public void method2(){       //9 
     System.out.println(line);     //10 
    } 

} 

На компиляции я хотел бы, чтобы это стало 6 для method1 и 10 для method2 так же, как это делает для конечных переменных. Поэтому, когда я запускаю код, который я получить выход

6 
10 

Если я переложить часть кода вверх или вниз, компилятор будет обрабатывать его, и я не придется беспокоиться об этом. Мне это нужно для ведения журнала. Log4j может получить один и тот же результат, но он получает номер строки из stacktrace в потоке и неэффективен, как указано в их документации. %L: Used to output the line number from where the logging request was issued. WARNING Generating caller location information is extremely slow and should be avoided unless execution speed is not an issue.. Я считаю, что эта работа будет намного более эффективной.

Возможно ли, чтобы программист использовал эту функцию и вставлял номера строк в код во время компиляции? Я знаю, что это возможно для компилятора, но это обнажает публичный api для других?

+1

Ну, вы могли бы попытаться добиться этого, ... проверьте javassist, эта вещь может манипулировать байт-кодом (без компилятора-thingy). Но какой черт вы хотите регистрировать, поэтому номер строки необходим? Я уверен, есть более элегантные способы достижения, что бы вы ни делали ... – slowy

ответ

0

Вы хотите получить номер строки в Runtime, а не компилировать время.

Вы можете сделать это, проверяя стеки.

Thread.getAllStackTraces(); 

Дает вам карту стека для каждой беговой нити.

Просто проверить его и посмотреть, как это выглядит:

Map<Thread, StackTraceElement[]> allStackTraces = Thread.getAllStackTraces(); 
    for (StackTraceElement[] elements: allStackTraces.values()) { 
     for (StackTraceElement e: elements) { 
      System.out.println(e.getClassName() + " " + e.getLineNumber()); 
     } 

    } 

Итак, если вы знаете, что тема и объект, который вы хотите, чтобы проверить. Конечно, вы можете получить номер строки.

+0

Это, вероятно, то, что делает log4j. Плюс это даст мне номера строк во время выполнения, а не время компиляции. – ares

Смежные вопросы