Есть ли способ скопировать часто используемые динамические процедуры в метод java?

Новичок в java, и в настоящее время я полагаюсь на множество выходных сообщений для отслеживания активности. Мне нужен способ сделать это чисто, чтобы сделать «полуизбыточный» код как можно незаметнее.

Первоначально я делал это: (Обратите внимание на операторы System.out.println.)

package hamburger;
...
public class Hamburger extends Application {
    ...
    public static void main(String args[]){                  
        System.out.println("--->  hamburger.Hamburger.main");  
        ...
        String [] drink = {"pepsi"};
        NoCoke.onlypepsi(drink);
        ...  ...
public class NoCoke
    public static void main(String args[]){                  
        System.out.println("--->  hamburger.NoCoke.main");  
        ...
    static void justpepsi(String... commandIn){
        System.out.println("--->  hamburger.NoCoke.justpepsi");  
        ... 
        try{ to get coke anyway... 

Конечно, когда я что-то перемещал или переименовывал, все эти литералы нужно было обновлять, поэтому я начал делать вещи динамически, используя эти три строки:

public class Hamburger
public static void main(String[] args) { 
    String nameClass  = new Throwable().getStackTrace()[0].getClassName(); 
    String nameMethod = new Throwable().getStackTrace()[0].getMethodName(); 
    System.out.println("--->  "+nameClass+"."+nameMethod);  

public class NoCoke
public static void main(String args[]){                  
    <AND HERE>
    public static void justpepsi(String... commandIn){
    <AND HERE>      

Он отлично работает:

--->  hamburger.Hamburger.main
--->  hamburger.NoCoke.main
--->  hamburger.NoCoke.justpepsi

Но мне не нравится, как это выглядит, занимает место и т.

Есть ли что-то вроде «тетради» в java? - документ, содержащий исполняемый код, который можно кинуть куда угодно? Или есть процедура для определения кода как что-то вроде «строки», которую можно было бы объявить в конструкторе, например так:

StringThing nameMessageRoutine = new (whatever...) StringThing
   "String nameClass  = new Throwable()...<etc>...
    System.out.println('--->  '+nameClass+'.'+nameMethod);'"  

... что я мог бы просто "импортировать" или "сослаться" вот так:

public class Hamburger extends Application {
public static void main(String args[]){ 
    import: nameMessageRoutine;         //outside of the package member

public class NoCoke
public static void main(String args[]){                  
    reference: nameMessageRoutine;      //defined in the constructor

Краткий ответ на ваш вопрос: нет. Более длинный ответ: используйте log4j, logback или java.util.Logging.

Elliott Frisch 15.05.2019 03:43

чувак, это было быстро. Я оставлю это без ответа на некоторое время, но тем временем я проверю утилиты, класс и т. д., которые вы предложили. Спасибо!

atomAnt 15.05.2019 03:48

Если вы действительно хотите это сделать, вы можете посмотреть Java Прокси и Обработчик вызова.

Benjamin Urquhart 15.05.2019 04:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Этот метод выводит информацию о том, откуда он был вызван:

static void printCurrent() {
    final StackTraceElement ste = new Throwable().getStackTrace()[1];
    String methodName = ste.getMethodName();
    String className = ste.getClassName();
    String lineNum = ""+ste.getLineNumber();
    System.out.println(className + ", " + methodName + ", Line " + lineNum);
}

Например:

package randomTest;

public class MainClass {
    public static void main(String[] args) {
        printCurrent();
    }
}

Выход

randomTest.MainClass, main, Line 131

Обновлено: Я знаю, что это не совсем ответ на вопрос, но он достигает конечной цели отслеживания активности кода. Чтобы ответить на вопрос (согласно заголовку), в чистой Java нет возможности автоматически вставлять подпрограммы в отмеченные места.

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

atomAnt 15.05.2019 06:12

Другие вопросы по теме