Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Behaviours of new constructor added by AspectJ ITD

Replied on stackoverflow.


On Mon, Jul 15, 2013 at 8:03 AM, pai <pikapai@xxxxxxxxx> wrote:
Hi! folk~ I have a question about behaviours of new constructor added by
AspectJ ITD


I am currently applying AspectJ to our project, and I found a behavior which
is a bit strange to me.

**Q1:**
I added a new constructor to my current class with inter-type declaration,
and found that the class's member variable is not initialized if the new
constructor is used to instantiate my class.

For example:

The class which I'll add a new constructor to:

*    public class Child {

        public String name = "John";

        public Child(String name) {
            // TODO Auto-generated constructor stub
        }
    } *

The aspectJ code:

*    public aspect MyTest {
        public Child.new(String name, int age) {
            System.out.println("Child Name:" + this.name);
        }
    }*

If I new the Child with the new constructor, the member variable name is not
initialized as will be done with the original constructor.

The result:
*> Child Name:null*

Is this a limitation of AspectJ? Is there anyway to resolve this issue?

I don't really want to add the code for member variable initialization to
the new constructor.

**Q2:**
It seems in the newly added constructor, super.method() can not be correctly
resolved.

The workaround is to define another method for your class, and indirectly
call the super.method()

For example, if the Child extends Parent.

*    public class Parent {

        public final void init() {
            //....
        }

    }*

I'll have to add a new metohd, say


*    public void Child.initState()
    {
        super.init();
    }*

Or the following exception will be thrown.

*    Exception in thread "main" java.lang.NoSuchMethodError:
com.test2.Child.ajc$superDispatch$com_test2_Child$init()V
        at MyTest.ajc$postInterConstructor$MyTest$com_test2_Child(MyTest.aj:19)
        at com.test2.Child.<init>(Child.java:1)
        at MainProgram.main(MainProgram.java:11)*

Is this a limitation of AspectJ? Is this the only way to resolve this issue?


Thank you all for your time :)

You can also answer my questions on stackoverflow. Many thanks!!

http://stackoverflow.com/questions/17647587/behaviours-about-new-constructor-added-by-aspectj-itd



--
View this message in context: http://aspectj.2085585.n4.nabble.com/Behaviours-of-new-constructor-added-by-AspectJ-ITD-tp4651015.html
Sent from the AspectJ - users mailing list archive at Nabble.com.
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users


Back to the top