Reflection - jak dostać się do obiektu który wywołał metode

Odpowiedz Nowy wątek
2016-06-06 13:13
0

Witam,
Mam za zadanie napisanie Loggera do pewnej aplikacji.
Niestety Logger za każdym wywołaniem potrzebuje podania mu obiektu

 Log.Show("Tekst Przykladowy" , this); 

W loggerze potrzebuje wywołać parę funkcji tego obiektu.
Czy można to jakoś obejść ? czy da się by logger sam przechwycił obiekt ?

Logger :

 public static void Show(String msg,Object obiekt) {

         //String callerClassName = new Exception().getStackTrace()[1].getClassName();
       //  String simpleClassName = callerClassName.substring(callerClassName.lastIndexOf('.') + 1);

        Method method = null; 
           try {
               method = obiekt.getClass().getMethod("getValueF");
           } catch (SecurityException e) {
            // exception handling omitted for brevity
          } catch (NoSuchMethodException e) {
            // exception handling omitted for brevity
            }
           Object ret = null; 
               try {
               ret =  method.invoke(obiekt ); 
             } catch (IllegalArgumentException e) { // exception handling omitted for brevity
             } catch (IllegalAccessException e) { // exception handling omitted for brevity
              } catch (InvocationTargetException e) { // exception handling omitted for brevity
              }

Pozostało 580 znaków

2016-06-06 14:01
1

Generalnie nie da sie czegoś takiego zrobic, szczególnie że wcale nie jest takie oczywiste co jest tym wołającym obiektem.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2016-06-06 15:29
0

czyli zostać przy tym przekazywaniu obiektu przez argument ?

Pozostało 580 znaków

2016-06-06 15:52
0

Zamiast statycznej metody show() gdzie przy każdym wywołaniu musisz podać referencję do obiektu, możesz zrobić niestatyczną metodę show(), a referencję podawać w konstruktorze lub stworzyć jakąś fabryczkę.

ale to logger więc pewnie loguje z różnych obiektów ;) - Shalom 2016-06-06 16:11
Może przecież wtedy logować z różnych obiektów :P - Lectre 2016-06-06 17:37

Pozostało 580 znaków

2016-06-06 19:36
0

ale jeśli zrobie metodę niestatyczną wówczas muszę tworzyć obiekt Loggera i za każdym razem podawać go w konstruktorze innych klas, co chyba też nie będzie najlepszym rozwiązaniem.

Pokaż pozostałe 2 komentarze
Przeciez np. SLF4J zwraca ci z fabryki instancję Loggera dla każdej klasy gdzie go używasz. - Lectre 2016-06-06 20:15
@Lectre dla każdej KLASY a nie dla obiektu. Zresztą to zupełnie nie rozwiazuje problemu który ma autor. W żaden sposób. Tylko utrudnia sprawę ;] - Shalom 2016-06-06 20:18
możesz spróbować napisać interfejs IShowAble i obiekt bedzie sam wiedział jak się pokazać, nie będziesz musiał parametru przekazywać ani stosować metody statycznej tylko this.showMe() i gotowe. Nie wiem czy tak będzie lepiej ani czy rozwiąże twój problem, ani czy o to chodzi ale na pewno można tak zrobić :P - topik92 2016-06-06 20:24
Worst tip race has begun :DDD - Lectre 2016-06-06 20:27
@Shalom Głównego problemu nie rozwiązuje, bo nie da się go rozwiązać. Moja uwaga tyczyła się "Niestety Logger za każdym wywołaniem potrzebuje podania mu obiektu ", co nie zmienia tego, że faktycznie była słaba. - Lectre 2016-06-06 20:34

Pozostało 580 znaków

2016-06-06 22:12
0

„Nie da się” :) A teraz metoda, że się da. Logger powinien być obudowany odpowiednim aspektem (patrz: http://stackoverflow.com/ques[...]orming-a-method-call-with-asp), który przechwyci informację o obiekcie wywołującym. Ale mi osobiście wołanie metod obiektu wywołującego z loggera przypomina paradoks żula w tramwaju.

Nie chciałem wspominać o AOP bo uważam to za robienie ze złego rozwiązania czegoś jeszcze gorszego ;] - Shalom 2016-06-06 22:22
@Shalom, oj tam, oj tam... - Koziołek 2016-06-06 22:25
Jeszcze popatrz jak on tam sprawdza czy akurat dostal dobry obiekt i sobie refleksja woła metody :D masakra - Shalom 2016-06-06 22:28
@Shalom, sam pomysł jest zły. Dlatego kod jakoś mnie nie rusza. Po prostu musi być zły :D - Koziołek 2016-06-06 22:42

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0