Ano, presne tak.

Korektni postup (ktery lze napriklad videt v commons-beanutils) je ten, ze se 
nikdy nepouziva primo
getClass(), ale vzdy se otestuje zda ta vracena trida je pristupna/verejna a 
pokud ne, pouzije se predek (pripadne jeji predek, etc).



> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
> Behalf Of Josef Cacek
> Sent: Monday, November 26, 2007 4:44 PM
> To: Java
> Subject: Re: IllegalAccessException pri pokusu prístupu na 
> getter Enumu
> reflexí
> 
> 
> Ahojte,
> 
> On Nov 26, 2007 4:15 PM, Podlesak Kamil 
> <[EMAIL PROTECTED]> wrote:
> 
> > > abstraktni metody fungovat nemusi. Problem je v tom, ze jednotlive
> > > prvky jsou v enumu reprezentovany anonymnimi tridami - tzn. maji
> > > nastaveny default access (package protected).
> >
> >  Jiste, to je to co jsem psal (resp. minil).
> >  A prave proto jsem navrhoval verejne abstaktni metody 
> (public abstract) primo v samotnem enumu (tj. ve verejnem 
> predkovi tech anonymnich metod). Ty pak samozrejme lze volat 
> odkudkoliv, protoze deklarace je verejna (public) ve verejne 
> tride (public). Minimalne to nevadi kompilatoru, s reflexi 
> jsem si, priznavam, moc nehral.
> 
> No prave, ona tam vadi ta reflexe (i v pripade, ze u predka jsou
> abstraktni metody public), protoze nastroje jako beanutils volaji
> nejakou variaci kodu, ktery jsem tu uvedl.
> 
> > > 
> instance.getClass().getMethod("getNeco",null).invoke(instance,null);
> 
> Otazkou je, proc tam nepouziji to setAccessible().
> 
> Abstrakce v nasem prikladu neni nutna, protoze predpokladam, ze v
> interfecu HasValue, ktery to implementovalo, bude uvedena metoda
> getValue().
> 
> Z tohoto pohledu funguje bezproblemove konstrukce:
> HasValue.class.getMethod("getValue", null).invoke(instance, null);
> 
> V tomto pripade uz se mi ale nevyplati pouzivat reflexi a tu metodu
> bych mel volat primo.
> ((HasValue) instance).getValue();
> 
> Nejkorektnejsi by asi bylo podivat se na Classu predka, jestli vraci
> isAccessible() == true a v tom pripade ho pouzit pri volani invoke:
> 
> instance.getClass().getEnclosingClass().getMethod("getValue",
> null).invoke(instance, null);
> 
> > Kamil Podlesak
> 
> -- pepa cacek
> 

Odpovedet emailem