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
> --------------------------------------------------------------
> 

Odpovedet emailem