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?
Dobijanje reference na objekat pozivaoc
Zaključano
Zakačeno
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
exception i posle uhvatis caller name?
Throwable.getStackTrace()
i nekako to parsujes i nadjes ko te je zvao....
my 2c
Hehe, ali ne treba mi samo info ko me je zvao, vec da nesto radim sa njim :)
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..:)
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..:)
Poz,
nemnesic, jesi li videp PP koju sam ti poslao?
nemnesic, jesi li videp PP koju sam ti poslao?
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..:)
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...
izmenjeno 1 put, poslednji put uranium 06.06.2007. u 06:33
Izmene poruke
- uranium06.06.2007. u 06:33zapis iz teksta poruke
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?
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?
Potpis
Attempt all the problems. Those you can do, don't do. Do the ones you cannot.
Niko nije rekao da je B podklasa A, sta god ti to znacilo..
Nadam se da ti je sada jasnije..
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
}
}
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..
@Uranium Tvoj post nema veze sa osnovnim pitanjem u temi.
@Vanja Jel ti je tema više kao "intelekualna rasprava" ili imaš konkretan problem ?
@Vanja Jel ti je tema više kao "intelekualna rasprava" ili imaš konkretan problem ?
Potpis
OTPOR blokadi ulica, OTPOR blokiranom Beogradu, OTPOR blokiranoj Srbiji
Intelektualna
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..
Salu na stranu, naleteo sam u jednom programu na gomilu predavanje this-a metodama upravo iz pomenutog razloga, pa mi se rodilo pitanje..
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
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.
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.
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
E da, to je dobro pitanje!
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. :)
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
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 :)))
izmenjeno 1 put, poslednji put filmil 11.06.2007. u 19:43
Izmene poruke
- filmil11.06.2007. u 19:43zapis iz teksta poruke
Š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.
f
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();
}}
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
Cao Filipe, dugo te nije bilo... :)
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:
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();
}
}
public class A {
public void foo(B b) {
b.bar(this);
}
public void foo2() {}
}
public class B {
public void bar(A a) {
a.foo2();
}
}