Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 22 odgovora
  • 10.536 pregleda

Najnovija ↓

Dobijanje reference na objekat pozivaoc 05.06.2007. u 20:55 · pre 236 meseci #1
Mozda previse mastam, ali me ipak zanima da li postoji nacin da se u telu metode dobije referenca na objekat koji je pozvao metodu, bez da se eksplicitno predaje this, kao argument metode?
Re: Dobijanje reference na objekat pozivaoc 05.06.2007. u 21:53 · pre 236 meseci #2
ne verujem da mozes, ali...negde sam cuo / procitao da sta ako bacis
exception i posle uhvatis caller name?
Throwable.getStackTrace()
i nekako to parsujes i nadjes ko te je zvao....

my 2c
Re: Dobijanje reference na objekat pozivaoc 05.06.2007. u 22:24 · pre 236 meseci #4
hmmm...
jel mozes tu da iskoristis arch4j?
znaci nadjes ko te je zvao...a pre toga napravis template sa arch4j...i
onda samo zammenis ime...hmmm...mozda ja mastam..:)
Re: Dobijanje reference na objekat pozivaoc 05.06.2007. u 22:37 · pre 236 meseci #6
Citat:
nemnesic: hmmm...
jel mozes tu da iskoristis arch4j?
znaci nadjes ko te je zvao...a pre toga napravis template sa arch4j...i
onda samo zammenis ime...hmmm...mozda ja mastam..:)


Hm, nisam cuo za to, pogledacu...
Re: Dobijanje reference na objekat pozivaoc 06.06.2007. u 06:03 · pre 236 meseci
izmenjeno 1 put, poslednji put uranium 06.06.2007. u 06:33
  1. uranium06.06.2007. u 06:33zapis iz teksta poruke
#7
Da li bi neko bio ljubazan da objasni o čemu se ovde radi?

Ako imamo neki metod f(), on mora biti metod neke klase recimo A.
I sad ako je x instanca neke klase B (podklasa klase A) prilikom poziva x.f() unutar tela metode f() će važiti this == x i sa this možemo da radimo šta nam je volja... Jasno je da this nije eksplicitno prosleđen...

Am I missing something here? :O
Potpis
Attempt all the problems. Those you can do, don't do. Do the ones you cannot.
Re: Dobijanje reference na objekat pozivaoc 06.06.2007. u 09:35 · pre 236 meseci #8
Niko nije rekao da je B podklasa A, sta god ti to znacilo..

Code:

public class A {

    // ...
    
    public void someMethodOfA() {
        B b = new B();
        b.someMethodOfB();
    }

    public void someOtherMethodOfA() {
        // do something
    }

}

public class B {

    // ...
    
    public void someMethodOfB() { // nema argumenta tipa A
        // Ovde hocu da pozovem someOtherMethodOfA od instance klase A koja je pozvala ovu metodu someMethodOfB
    }

}


Nadam se da ti je sada jasnije..
Re: Dobijanje reference na objekat pozivaoc 06.06.2007. u 09:38 · pre 236 meseci #9
@Uranium Tvoj post nema veze sa osnovnim pitanjem u temi.

@Vanja Jel ti je tema više kao "intelekualna rasprava" ili imaš konkretan problem ?
Potpis
OTPOR blokadi ulica, OTPOR blokiranom Beogradu, OTPOR blokiranoj Srbiji
Re: Dobijanje reference na objekat pozivaoc 06.06.2007. u 14:35 · pre 236 meseci #12
Ma ne bi verovao koliko ;)

Salu na stranu, naleteo sam u jednom programu na gomilu predavanje this-a metodama upravo iz pomenutog razloga, pa mi se rodilo pitanje..
Re: Dobijanje reference na objekat pozivaoc 07.06.2007. u 10:15 · pre 236 meseci #13
Nisam o tome nikad razmišljao. Ili predam this, ili ako to ima smisla napravim od nečega singleton ili odmah popunim neku public static refernecu. Zavisi od slučaja do slučaja.
Potpis
OTPOR blokadi ulica, OTPOR blokiranom Beogradu, OTPOR blokiranoj Srbiji
Re: Dobijanje reference na objekat pozivaoc 08.06.2007. u 13:35 · pre 236 meseci #14
Posto je ovo akademska rasprava pokusacu da dam svoje vidjenje problema.

Moje misljenje je da to ne moze da se uradi koriscenjem trenutne implementacije programskog jezika Java. Bar ne moze da se uradi elegantno i efikasno da bi imalo vise smisla od prosledjivanja reference this.

U jeziku Java bi mogla da se definise referenca, nazovimo je caller poput this. Ta referenca bi dobijala vrednost u runtime-u pri kreiranju konteksta poziva metode (poput predavanja stvarnih argumenata). To bi bio posao za JVM ili bi se to moglo odraditi pomocu nekakvog glue koda koji bi kompajler generisao, a koji bi bio smesten pre prve naredbe metode.

Medjutim cini mi se da ovakvo resenje ne bi bilo dovoljno efikasno zbog povecanja bajt koda ili zbog usporavanja izvrsenja usled odredjivanja adrese caller objekta. Takodje javlja se problem prepoznavanja klase objekta caller. Tu bi moglo da dodje do bacanja izuzetka ClassCastException sto bi zahtevalo da se svako koriscenje reference caller zastiti try catch blokom. To bi dosta zamaglilo kod metode.
Potpis
http://www.linkedin.com/in/radegm
Re: Dobijanje reference na objekat pozivaoc 11.06.2007. u 09:52 · pre 236 meseci #15
Sasvim. Nemojmo smetnuti s' uma i konkurentno izvođenje toka programa. I ako, na primer, metod nije deklarisan kao synchronized već je otvoren za multuthread izvršavanje, u istom trenutku može biti više pozivnih klasa. Šta onda ?
Potpis
OTPOR blokadi ulica, OTPOR blokiranom Beogradu, OTPOR blokiranoj Srbiji
Re: Dobijanje reference na objekat pozivaoc 11.06.2007. u 14:59 · pre 236 meseci #17
Ok kakvom metodu se radi? Statickom? Ako ja dobro razumem pitanje onda sam malo zbunjen, jer ako nije staticki onda ti je objekat koji poziva metod uvek poznat (jer ces uvek pozivati metod sa objekat.metod() ). Ako se radi o statickom metodu, onda moras da predas this ako zelis da znas koji objekat ga je pozvao.

Pade mi na pamet nesto... Jedini nacin da se ovo odradi je najverovatnije da se koristi JAVA Debugging API. Pomocu njega vrlo verovatno mozes dobiti referencu na objekat koji poziva metod. Ne secam se kako, ali mozes naci u dokumentaciji. :)
Potpis
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
Re: Dobijanje reference na objekat pozivaoc 11.06.2007. u 17:55 · pre 236 meseci #18
Citat:
leka: Ok kakvom metodu se radi? Statickom? Ako ja dobro razumem pitanje onda sam malo zbunjen, jer ako nije staticki onda ti je objekat koji poziva metod uvek poznat (jer ces uvek pozivati metod sa objekat.metod() ). Ako se radi o statickom metodu, onda moras da predas this ako zelis da znas koji objekat ga je pozvao.


Ne radi se o statickom metodu. Pa da, ali ovde se radi o tome "odakle ti je poznat". Treba da ti bude poznat u okviru koda pozvane metode, a ne iz koda koji pozvao metodu pomenutog objekta.

Citat:

Pade mi na pamet nesto... Jedini nacin da se ovo odradi je najverovatnije da se koristi JAVA Debugging API. Pomocu njega vrlo verovatno mozes dobiti referencu na objekat koji poziva metod. Ne secam se kako, ali mozes naci u dokumentaciji. :)


Posto je pitanje teorijskog tipa, pogledacu ako postane prakticnog tipa :)))
Re: Dobijanje reference na objekat pozivaoc 11.06.2007. u 19:08 · pre 236 meseci
izmenjeno 1 put, poslednji put filmil 11.06.2007. u 19:43
  1. filmil11.06.2007. u 19:43zapis iz teksta poruke
#19
Šta bi ti tačno da dobiješ?

Tvoj primer (http://www.elitesecurity.org/p1598503) može da se uradi bez gimnastike koju si predložio. Proslediš klasi B ne this, već referencu na privatnu instancu nekog unapred definisanog interfejsa.

Onda lepo zoveš u interfejsu do mile volje metode koje hoćeš, a klasa A nema uslov da nasleđuje išta posebno.

Code:

public interface Foo {
  public void method();
}

public class A {
  public void foo(B b) {
    b.bar(new Foo() {
      public void method()  {
        foo2(); // Ili šta ti već treba.
      }
    });
  }

  public void foo2() {}
}

public class B {
  public void bar(Foo f) {
    f.method();
  }}



f
Re: Dobijanje reference na objekat pozivaoc 11.06.2007. u 20:14 · pre 236 meseci #20
Cao Filipe, dugo te nije bilo... :)

Citat:
Šta bi ti tačno da dobiješ?


Nista specijalno, u tome je stos ;)

Ako uzmemo u obzir da je ovo teorijska rasprava i da je poenta bila da "kod sam auto magicno nekako shvati ispod haube ko ga je pozvao" odnosno da ne mora da se predaje nista, onda mozemo da kazemo da je tvoje resenje znatno kompleksnije od polaznog, "problematicnog" koda ovog tipa:

Code:

public class A {
  public void foo(B b) {
    b.bar(this);
  }
  public void foo2() {}
}

public class B {
  public void bar(A a) {
    a.foo2();
  }
}
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme