Подскажите Java код метода который делает
От: Аноним  
Дата: 07.12.10 00:47
Оценка:
Например есть пара классов:
class Vremja{
   void saveVremja(){
   ...
   PrintClass.printMethod();
   ...
   }
}
class Dengi{
   void countDengi(){
   ...
   PrintClass.printMethod();
   ...
   }
}

и класс
class PrintClass {
   static void printMethod(){
   System.out.println(" вызов из"+ ???? );
   }
}

Подскажите код метода printMethod() чтобы вывод выглядел примерно так:
"вызов из класс Vremja, метод saveVremja".
"вызов из класс Dengi, метод countDengi"
Re: Подскажите Java код метода который делает
От: Hellhang Россия  
Дата: 07.12.10 04:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Например есть пара классов:

А>
А>class Vremja{
А>   void saveVremja(){
А>   ...
А>   PrintClass.printMethod();
А>   ...
А>   }
А>}
А>class Dengi{
А>   void countDengi(){
А>   ...
А>   PrintClass.printMethod();
А>   ...
А>   }
А>}
А>

А>и класс
А>
А>class PrintClass {
А>   static void printMethod(){
А>   System.out.println(" вызов из"+ ???? );
А>   }
А>}
А>

А>Подскажите код метода printMethod() чтобы вывод выглядел примерно так:
А>"вызов из класс Vremja, метод saveVremja".
А>"вызов из класс Dengi, метод countDengi"


Вы удивитесь но:

class PrintClass {
    public static void printMethod(String str) {
        System.out.println(str);
    }
}


В принципе зачем городить отдельный класс для всего этого? Огласите суть задачи хотя бы.
Re[2]: Подскажите Java код метода который делает
От: Аноним  
Дата: 07.12.10 05:47
Оценка:
Здравствуйте, Hellhang, Вы писали:

H>В принципе зачем городить отдельный класс для всего этого? Огласите суть задачи хотя бы.


Подозреваю, автор хотел из статического метода получить то, откуда этот вызов пришил. Бэктрэйс анализировать, наверное надо.
Re: Подскажите Java код метода который делает
От: techgl  
Дата: 07.12.10 06:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подскажите код метода printMethod() чтобы вывод выглядел примерно так:

А>"вызов из класс Vremja, метод saveVremja".
А>"вызов из класс Dengi, метод countDengi"
Посмотри исходный код log4j, например. Там есть определение строки, и метода, откуда был вызов.
Re: Подскажите Java код метода который делает
От: Nicht Россия  
Дата: 07.12.10 06:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Например есть пара классов:

А>
А>class Vremja{
А>   void saveVremja(){
А>   ...
А>   PrintClass.printMethod();
А>   ...
А>   }
А>}
А>class Dengi{
А>   void countDengi(){
А>   ...
А>   PrintClass.printMethod();
А>   ...
А>   }
А>}
А>

А>и класс
А>
А>class PrintClass {
А>   static void printMethod(){
А>   System.out.println(" вызов из"+ ???? );
А>   }
А>}
А>

А>Подскажите код метода printMethod() чтобы вывод выглядел примерно так:
А>"вызов из класс Vremja, метод saveVremja".
А>"вызов из класс Dengi, метод countDengi"

Thread.dumpStack() ?
Re: Подскажите Java код метода который делает
От: freeb1rd Россия  
Дата: 07.12.10 07:32
Оценка:
А>Подскажите код метода printMethod() чтобы вывод выглядел примерно так:
А>"вызов из класс Vremja, метод saveVremja".
А>"вызов из класс Dengi, метод countDengi"

StackTraceElement[] stack = new Exception().getStackTrace();
System.out.println("вызов из класс " + stack[1].getClassName() + ", метод " + stack[1].getMethodName());
Re: Подскажите Java код метода который делает
От: Blazkowicz Россия  
Дата: 07.12.10 09:16
Оценка:
Здравствуйте, Аноним, Вы писали:

Разворачивать stack очень накладно в плане производительности. Т.е. для единичного использования подойдет, а вот для большого количество кода во всей системе может привести к тормозам.
Есть такой неофициальный метод получения класса sun.reflect.Reflection.getCallerClass(). Должен быть быстрее.
Если нужно ещё имя метода, и без потерь с производительностью, то только AOP
Re[2]: Подскажите Java код метода который делает
От: Аноним  
Дата: 07.12.10 09:41
Оценка:
Здравствуйте, Blazkowicz, Вы писали:
а что такое АОР?
да это для логирования. просто а о многих местах в код вставляются метод
со многими параметрами, а зотелось бы вызов метода со всего одним параметром
B>Здравствуйте, Аноним, Вы писали:

B>Разворачивать stack очень накладно в плане производительности. Т.е. для единичного использования подойдет, а вот для большого количество кода во всей системе может привести к тормозам.

B>Есть такой неофициальный метод получения класса sun.reflect.Reflection.getCallerClass(). Должен быть быстрее.
B>Если нужно ещё имя метода, и без потерь с производительностью, то только AOP
Re[3]: Подскажите Java код метода который делает
От: Аноним  
Дата: 07.12.10 09:56
Оценка:
А>Подозреваю, автор хотел из статического метода получить то, откуда этот вызов пришил. Бэктрэйс анализировать, наверное надо.
А как этот Бэктрэйс делается?
Я "логю" во многих местах разных классов разную инфу и чисто визуально исходный код
загроможден этими логами с кучей параметров (откуда вызван логер : класс, метод)
А не лучще бы чтоб метод сам определял это
вот это мне надо
Re[3]: Подскажите Java код метода который делает
От: Blazkowicz Россия  
Дата: 07.12.10 10:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>а что такое АОР?

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

А>да это для логирования. просто а о многих местах в код вставляются метод

А>со многими параметрами, а зотелось бы вызов метода со всего одним параметром
Существуют разные методы и библиотеки для реализации. Например обернуть все ваши классы проксями. В прокси класс и метод можно узнать из параметров. Или во время загрузки классов модифицировать байткод, так чтобы он добавлял нужные методы. Этот вариант ещё и по производительности лучше.
Посмотрите документацию по Spring AOP или Aspect4J
Re[4]: Подскажите Java код метода который делает
От: Аноним  
Дата: 07.12.10 11:42
Оценка:
Вернувшись назад к коду, если я сделаю вот так

class Vremja{
   void saveVremja(){
   ...
   PrintClass.printMethod();
   ...
   }
}
class Dengi{
   void countDengi(){
   ...
   PrintClass.printMethod();
   ...
   }
}

и класс

class PrintClass {
   static void printMethod(){
   String methodName = Thread.currentThread().getStackTrace()[1].getMethodName(); 
   System.out.println("methodName = " + methodName); 
   }
}

Будет ли это работать как мне надо? Я имеею ввиду производительность и проч.
Re[5]: Подскажите Java код метода который делает
От: Blazkowicz Россия  
Дата: 07.12.10 12:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Будет ли это работать как мне надо? Я имеею ввиду производительность и проч.

Откуда нам знать как вам надо? Производительность будет так себе. Но если вы будете вызывать метод не часто, то почему бы и нет?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.