Pri pouzivani BeanInfo (a predevsim jeho obdob od apache i od jinych) doporucuji ridit se heslem: duveruj, ale proveruj!
V tomto pripade je to jeste jenom takova sranda, ale pockejte az narazite na synteticke metody. Kamil Podlesak -- [EMAIL PROTECTED] > -----Original Message----- > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] > Behalf Of Ing. Jan Novotný > Sent: Monday, November 26, 2007 3:49 PM > To: Java > Subject: Re: IllegalAccessException pri pokusu prístupu na > getter Enumu > reflexí > > > Používá se tam logika z java.beans.* - konkrétně: > > BeanInfo info = Introspector.getBeanInfo(clazz); > PropertyDescriptor[] descriptors = info.getPropertyDescriptors(); > > pak se podle name najde jeden konkrétní PropertyDescriptor a pak už: > > Method m = pd.getReadMethod(); > if (m != null) { > return m.invoke(bean); > } > > Tzn. logika získávání objektů Method je skrytá uvnitř Javy. > Nicméně problém bude asi v tom, že class name je: class > com.fg.xxx.model.QueryStatus$1, což se vztahuje již k té podřízené > třídě. > > Problém bude tedy se získáváním toho className. A ten se získává na > základě itemu z dané kolekce, kde kolekci získám jednoduše: > > Arrays.asList(QueryStatus.values()); > > Stripsy začnou iterovat po itemech z této kolekce a nad > každým si zavolají: > > Type type = this.bean.getClass(); > > Pak získají nacachované PropertyDescriptory - viz. začátek emailu a ty > už vrací "virtuální" classy pro jednotlivé enum QueryStatus classy. > > Takže problém je již osvětlený, ale stejně mi nějak nedochází jak z > toho ven. Je mi jasné, že se potřebuju dostat k tomu, aby className = > "class com.fg.xxx.model.QueryStatus", ale netuším jak to zařídit. > > Honza N. > > 2007/11/26, Jiri Mares <[EMAIL PROTECTED]>: > > > > A co se podivat do zdrojaku jak je to udelany ... > > > > Podlesak Kamil napsal(a): > > > Zajímavé, abstraktní metody musí fungovat... jak tu > instanci Method získáváte? > > > getMethod() nebo getDeclaredMethod()? Důležité je, že se > musí jednat o metodu z předka, nikoliv z potomka (interní třídy). > > > > > > Kamil Podlešák > > > > > >> -----Original Message----- > > >> From: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED] > > >> Behalf Of Ing. Jan Novotný > > >> Sent: Monday, November 26, 2007 2:53 PM > > >> To: Java > > >> Subject: Re: IllegalAccessException pri pokusu prístupu na > > >> getter Enumu > > >> reflexí > > >> > > >> > > >> Díky za nakopnutí, tohle se trefilo do černého - alespoň > co se týká > > >> zdůvodnění. Když jsem v debug režimu manuálně nastavil metodě > > >> setAccessible(true), už invoke() prošlo bez chyby a > vrátilo to, co > > >> mělo. Bohužel doplnění abstraktní metody do QueryStatus > nepomohlo a > > >> bez setAccessible(true) se k danému getteru nedostanu - > pro úplnost > > >> uvádím aktualizovanou třídu: > > >> > > >> public enum QueryStatus implements HasValue { > > >> INSERTED { > > >> public Integer getValue() { return 0; } > > >> public String getLabel() { return "vloženo"; } > > >> }, > > >> ALLOWED { > > >> public Integer getValue() { return 1; } > > >> public String getLabel() { return "schváleno"; } > > >> }, > > >> FORBIDDEN { > > >> public Integer getValue() { return 2; } > > >> public String getLabel() { return "zamítnuto"; } > > >> }; > > >> > > >> public abstract String getLabel(); > > >> > > >> } > > >> > > >> Navíc jsem objevil, že Stripes mají tag > <stripes:options-enumeration/> > > >> u kterého jsem si myslel, že bude natvrdo nastavováno > setAccessible, > > >> ale není tomu tak - padá to na IllegalAccess také. > > >> > > >> Zkusím ještě popátrat na gůglu. > > >> > > >> Honza N. > > >> > > >> 2007/11/26, Podlesak Kamil <[EMAIL PROTECTED]>: > > >>> Myslim ze bude stacit doplnit deklaraci tech metod v > > >> samotne tride QueryStatus (jako abstraktni metody). > > >>>> public enum QueryStatus implements HasValue { > > >>>> INSERTED { > > >>>> public Integer getValue() { return 0; } > > >>>> public String getLabel() { return "vloženo"; } > > >>>> }, > > >>>> ALLOWED { > > >>>> public Integer getValue() { return 1; } > > >>>> public String getLabel() { return "schváleno"; } > > >>>> }, > > >>>> FORBIDDEN { > > >>>> public Integer getValue() { return 2; } > > >>>> public String getLabel() { return "zamítnuto"; } > > >>>> } > > >>> public abstract Integer getValue(); > > >>> public abstract String getLabel(); > > >>>> } > > >>> Jednotlive instance jsou neverejne tridy, tedy je normalne > > >> nelze pouzivat a nelze ani volat metody v nich deklarovane. > > >> Tato omezeni se za normalnich okolnosti kontroluji i pri > > >> pouzivani reflection, ale kontrolu lze vypnout zavolanim > > >> method.setAccessible(true). Nektere knihovny pouzivajicich > > >> reflection toto delaji, coz vysvetluje proc se v nich tento > > >> problem neobjevi (zatimco v jinych ano). > > >>> Kamil Podlesak > > >>> -- > > >>> [EMAIL PROTECTED] > > >>> > > >>> > > >>>> -----Original Message----- > > >>>> From: [EMAIL PROTECTED] > > > [mailto:[EMAIL PROTECTED] > > >>> Behalf Of Ing. Jan Novotný > > >>> Sent: Monday, November 26, 2007 1:58 PM > > >>> To: Java > > >>> Subject: IllegalAccessException pri pokusu prístupu na > getter Enumu > > >>> reflexí > > >>> > > >>> > > >>> Zdravím konferenci, > > >>> > > >>> dokážete někdo vysvětlit proč při přístupu k metodám > Java enum > > >>> typu, který mám definován takto: > > >>> > > >>> public enum QueryStatus implements HasValue { > > >>> INSERTED { > > >>> public Integer getValue() { return 0; } > > >>> public String getLabel() { return "vloženo"; } > > >>> }, > > >>> ALLOWED { > > >>> public Integer getValue() { return 1; } > > >>> public String getLabel() { return "schváleno"; } > > >>> }, > > >>> FORBIDDEN { > > >>> public Integer getValue() { return 2; } > > >>> public String getLabel() { return "zamítnuto"; } > > >>> } > > >>> } > > >>> > > >>> vyhazuje java IllegalAccessException? Podaří se mi > získat i object > > >>> Method pro danou getter metodu, ale když se zavolá > metoda invoke, > > >>> vyletí vyjímka IllegalAccessException. Nějak se mi > nepodařilo nic > > >>> vygůglit, tak si nedokážu vysvětlit, kde je problém. > > >>> > > >>> Honza N. > > >>> > > >>> -- > > >>> -------------------------------------------------------------- > > >>> Ing. Jan Novotný > > >>> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ > > >>> http://blog.novoj.net > > >>> Myšlenky dne otce Fura > > >>> -------------------------------------------------------------- > > >>> > > > > > > > > > > -- > > Jiří Mareš (mailto:[EMAIL PROTECTED]) > > ČSAD SVT Praha, s.r.o. (http://www.svt.cz) > > Czech Republic > > > > > -- > -------------------------------------------------------------- > Ing. Jan Novotný > @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ > http://blog.novoj.net > Myšlenky dne otce Fura > -------------------------------------------------------------- >
