Hi,
Apologies. Been very busy of late. Been thinking about what you wrote -
there was a related article in one of the Java mags as well.
I will be out of town this week, and promise to stop this consulting
foolishness and engage properly when I get back. :)
geir
Stephane Bailliez wrote:
>
> Geir,
>
> I assumed you got my last mail(see below) about the reflection problem that
> arises with private class. What is your current position about this ?
>
> I definitely agree that the workaround (this is a workaround) I sent is bad,
> but what do you think about changing the method invocation by keeping the
> class of the return type instead of the object class ?
>
> Is that feasible without breaking too many things ?
>
> --
> Stephane Bailliez
> Software Engineer, Paris - France
> iMediation - http://www.imediation.com
> Disclaimer: All the opinions expressed above are mine and not those from my
> company.
>
> > -----Original Message-----
> > From: Stephane Bailliez [mailto:[EMAIL PROTECTED]]
> > Sent: Friday, July 27, 2001 10:09 AM
> > To: [EMAIL PROTECTED]
> > Subject: RE: [PATCH] ASTMethod / IllegalAccessException
> >
> >
> > > -----Original Message-----
> > > From: Geir Magnusson Jr. [mailto:[EMAIL PROTECTED]]
> > >
> > > Eh. Before making the statement "Velocity shouldn't change
> > > modifiers of
> > > methods in the context", I am interested to see what classes you are
> > > working with, and why the problem occurrs....
> >
> > The below sample should give you an idea, it is more precise
> > than my last
> > post. (and it compiles :) It should print:
> >
> > Call via return type class: SUCCESS
> > Call via base class: FAILED
> >
> > The problem is that the current Velocity code will perform
> > reflection on the
> > base class of an object (o.getClass()). Thus my point to
> > 'save' the return
> > type of the object from a method call each time there is a
> > reflection call,
> > otherwise we are unable to know which object we are working
> > on the next time
> > we will use it and we will incorrectly use the base class to
> > perform the
> > call. Base class that might perfectly be of private access
> > and expose its
> > public interface to a caller (ie, for example Itr is a
> > private class of
> > AbstractList that implements Iterator and that is sent back via the
> > iterator() call)
> >
> > I'm not familiar yet with the velocity code since I have only
> > been using it
> > for eval for less than 2 weeks so I cannot give you a patch
> > to do this which
> > is to me the ideal solution rather than the ugly hack I did.
> >
> > --- Test.java
> >
> > import java.util.*;
> > import java.lang.reflect.*;
> >
> > public class Test {
> >
> > public static void main(String[] args) throws Exception {
> > ArrayList list = new ArrayList();
> > Object o = list.iterator();
> >
> > try {
> > Class clazz =
> > list.getClass().getMethod("iterator",
> > new Class[0]).getReturnType();
> > Method method = clazz.getMethod("hasNext", new
> > Class[0]);
> > method.invoke(o, null);
> > System.out.println("Call via return type class:
> > SUCCESS");
> > } catch (Exception e){
> > System.out.println("Call via return type class:
> > FAILED");
> > }
> >
> > try {
> > Class clazz = o.getClass();
> > Method method = clazz.getMethod("hasNext", new
> > Class[0]);
> > method.invoke(o, null);
> > System.out.println("Call via base
> > class: SUCCESS");
> > } catch (Exception e){
> > System.out.println("Call via base
> > class: FAILED");
> > }
> > }
> >
> > }
> >
> >
> >
> > --
> > Stephane Bailliez
> > Software Engineer, Paris - France
> > iMediation - http://www.imediation.com
> > Disclaimer: All the opinions expressed above are mine and
> > not those from my
> > company.
> >
> >
--
Geir Magnusson Jr. [EMAIL PROTECTED]
System and Software Consulting
Developing for the web? See http://jakarta.apache.org/velocity/
Be well, do good work, and keep in touch.