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