Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Can I do any of these 3 things with aspectJ

Hi Jim

I do understand my mistake and apologise to all for sending batch
questions in one mail. I will make a note of that.

I understand that its not possible to achieve this, due to byte code
limitations. This brings me with the only choice to manuplate byte code
itself for the default constructor (may be to call overloaded
constructor) or probably something else (somehow), if I still need to
fulfill my #1 requirement. That is what I was trying to avoid =(

Please help me, if I am missing something here.!

Thanks for your time Jim.

Cheers
Tarun


On Mon, 08 Sep 2003 13:20:02 -0700, "Jim Hugunin" <lists@xxxxxxxxxxx>
said:
> BTW - I think you'll have better luck getting your questions answered if 
> you ask them one at a time instead of in batches.  In that spirit, 
> here's my answer to "#1":
> 
> Tarun wrote:
>  >>Question 1 : If, my requirement is to return a different instance (say
>  >>instantiating overloaded constructor) of an object whose default
>  >>constructor is called. Can I do that with aspectJ. The limitation is that
>  >>I do not want to use call() pointcut, (as this needs the caller's to be
>  >>included in weaving though source or binary and I do not have control
>  >>over the usages of my framework).
> 
> It is not possible to change the object that is returned by a 
> constructor without access to the code that is calling the constructor. 
>   This limitation is caused by the design of the Java bytecode and JVM, 
> and there's no way around this restriction short of using a modified 
> JVM.  Here's the bytecode for a simple call to a constructor, "new C()":
> 
>    new C
>    dup
>    invokespecial void C.<init>()
> 
> The new object is created by a special 'new' bytecode, then it is 
> duplicated to keep a copy on the stack, and then the constructor is 
> called to initialize the object.  Notice that the constructor itself 
> returns void.  The only way to change the object returned by this 
> constructor call is to have access to the call-site (as shown above), 
> where after the call to the constructor a different object can be put on 
> the stack if desired.
> 
> Ron Bodkin wrote:
>  > Re: #1, I believe the only way to change the constructed object is
>  > with call advice. This is a case where AspectJ-1.0's callee-side
>  > support for call advice allowed a capability that AspectJ-1.1 can't
>  > achieve :-( One way to achieve the same effect would be to use factory
>  > methods in your framework instead of default constructors, which you
>  > can then advise.
> 
> This is not a change from ajc-1.0.  The callee-side implementation of 
> call join points in 1.0 would silently not be used in this case because 
> it was impossible for the implementation to change the returned object. 
>   This kind of surprising (and often silent) implementation restriction 
> was a big part of why we removed the callee-side implementation from 
> ajc-1.1.  Any time that you NEED some special property that is only 
> available at a call joinpoint, and not at the corresponding execution 
> joinpoint, then you also NEED access to the call-site at compile-time, 
> load-time or weave-time.
> 
> -Jim
> 
> 
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> http://dev.eclipse.org/mailman/listinfo/aspectj-users
-- 
  Tarun Sharma
  t_sharma@xxxxxxxxxxxx

-- 
http://www.fastmail.fm - The way an email service should be


Back to the top