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 >
