Новичок в 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
чувак, это было быстро. Я оставлю это без ответа на некоторое время, но тем временем я проверю утилиты, класс и т. д., которые вы предложили. Спасибо!
Если вы действительно хотите это сделать, вы можете посмотреть Java Прокси и Обработчик вызова.




Этот метод выводит информацию о том, откуда он был вызван:
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 нет возможности автоматически вставлять подпрограммы в отмеченные места.
элегантный - лучше, чем я просил. Я смогу копать «трассировку стека» с гораздо меньшим количеством кода. с уважением.
Краткий ответ на ваш вопрос: нет. Более длинный ответ: используйте log4j, logback или
java.util.Logging.