On 12/28/05, Diogo Quintela (EF) <[EMAIL PROTECTED]> wrote:
>
> > -----Original Message-----
> > From: Thomas Dudziak [mailto:[EMAIL PROTECTED]
> > Sent: quarta-feira, 28 de Dezembro de 2005 15:23
> > To: Jakarta Commons Users List
> > Subject: Re: [digester] instantiationException if using internal classes
> ?
> >
> > On 12/28/05, Diogo Quintela (EF) <[EMAIL PROTECTED]> wrote:
> >
> > > Non-static inner classes as in your example, despite having an empty
> > > constructor, are managed internally by java through a constructor with
> > an
> > > instance to containing class instance (as I believe), so it has direct
> > > access to the instance variables and methods of its enclosing
> instance.
> > >
> > > A brief lookout into reflection api, doesn't seem to be able to
> > instantiate
> > > this type of classes; as digester is trying to instantiate that class
> > though
> > > reflection you must have problems...
> >
> > Inner classes need an outer class instance for creation. If you for
> > instance have this class:
> >
> > public class A
> > {
> >   public class B
> >   {
> >     ...
> >   }
> > }
> >
> > then you can create an instance of B *outside* of A only with:
> >
> > A anInstanceOfA = ...
> > B anInstanceOfB = anInstanceOfA.new B();
> >
> > If I remember correctly, reflection works similar. The inner class
> > won't have a no-arg constructor but instead every of its constructors
> > (even the default one supplied by Java if none is defined)
> > automatically gets an additional first parameter of the type of the
> > enclosing class. So accessing the constructor via reflection would be
> > something like:
> >
> > Constructor constructor = A.B.class.getDeclaredConstructor(new Class[]
> > { A.class});
> >
> > anInstanceOfB = (A.B)constructor.new Instance(new Object[] {
> anInstanceOfA
> > });
>
> You surely put it much cleaner than I did.


Yep :-).

In conclusion, if digester supports any kind of mechanism to define the
> constructors to be used (using values from the stack) Valerio can use
> inner
> classes at will.


And Digester does support such a mechanism, although it's a little more work
on your part.  Using FactoryCreateRule, you can provide a factory class to
produce the object instance that will be pushed on to the stack.  Your
factory can use whatever kind of code it wants in doing so.

Craig

Reply via email to