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 again (appended to original answer). Hopefully, this resolves your issue.


On Mon, Jul 15, 2013 at 12:27 PM, pai <pikapai@xxxxxxxxx> wrote:
Hi Alex!

I'm sorry that you think I don't  appreciate his answer.

But actually, I do appreciate for your kind response.

That's why I think I may not state my questions clear enough for people to
understand clearly.

It's my mistake.

It seems my questions was misunderstood.

I am quite familiar with Java, and that's why I know my questions are
misunderstood.

Could you spend some time reading my modified questions?

I'd really thankful for your help!


To make long story short:

Q1:

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

*    public class Child {

        public String name = "John";

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

The aspectJ code:

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

If I instantiate the Child with the new constructor:

*    new Child("A child", 5)*

What's the output?

What I saw is:

*Child Name:null*

Different from what I expected.


Q2:

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

*    public class Child extends Parent{

        public String name = "John";

        public Child(String desc) {

        }
    } *

*    public class Parent {

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

    }*

I add a new constructor for the *Child *in my aspect.
*    public aspect MyTest {
        public Child.new(String desc, int num) {
            super.init();
        }
    }
*

Can the code be compiled?

What I encountered is an thrown exception:
*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)*


Thanks for your patience!


Alexander Kriegisch-2 wrote
> Hello.
>
> With all due respect: Ramnivas has answered the question before on SO
> quite patiently. So as not to waste any more of his precious time I
> recommend you to
>  - read his answer,
>  - think again, especially about Q1 and
>  - learn some basic Java.
>
> Sorry if it sounds rude, but you seem not to appreciate his answer, which
> is also not very nice.
>
> Regards
> Alexander
>
>
> Am 15.07.2013 um 20:40 schrieb pai &lt;

> pikapai@

> &gt;:
>
>> Hi! thanks for the response.
>>
>> But it seems you have some misunderstanding about my questions.
>>
>> So I made some modifications to make it clear.
>>
>> Thank you for the help :)
>>
>>
>>
>> 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 desc) {
>>           // TODO Auto-generated constructor stub
>>       }
>>   }
>>
>> The aspectJ code:
>>
>>   public aspect MyTest {
>>       public Child.new(String desc, int num) {
>>           System.out.println("Child Name:" + this.name);
>>       }
>>   }
>>
>> If I instantiate the Child with the new constructor:
>>
>>   new Child("A child", 5)
>>
>> the member variable **this.name** is not initialized as will be done with
>> the original constructor.
>>
>> But, if I call the original constructor:
>>
>>   new Child("A child")
>>
>> the member variable **this.name** will be initialized to "John" as usual
>>
>> 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 class which I'll add a new constructor to:
>>
>>   public class Child extends Parent{
>>
>>       public String name = "John";
>>
>>       public Child(String desc) {
>>
>>       }
>>   }
>>
>> **Child** extends **Parent**. **Parent** has a method **init()**
>>
>>   public class Parent {
>>
>>       public void init() {
>>           //....
>>       }
>>
>>   }
>>
>> I add a new constructor for the **Child** in my aspect.
>>   public aspect MyTest {
>>       public Child.new(String desc, int num) {
>>           super.init();
>>       }
>>   }
>>
>> The above aspect code will trigger an exception.
>>
>>   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)
>>
>> My workaround is to define **another method** for my class **Child**, and
>> indirectly call the super.method() within that method
>>
>>
>> For example, add a new method that calls **super.init()** for **Child**
>>
>>   public void Child.initState()
>>   {
>>       super.init();
>>   }
>>
>> Now, I can call initState() in the newly added constructor like below:
>>
>>   public aspect MyTest {
>>       public Child.new(String desc, int num) {
>>           this.initState();
>>       }
>>   }
>>
>> **Is this a limitation of AspectJ? Is this the only way to resolve this
>> issue?**
>>
>> Thank you all for your time :)
>>
>>
>>
>> --
>> View this message in context:
>> http://aspectj.2085585.n4.nabble.com/Behaviours-of-new-constructor-added-by-AspectJ-ITD-tp4651015p4651019.html
>> Sent from the AspectJ - users mailing list archive at Nabble.com.
>> _______________________________________________
>> aspectj-users mailing list
>>

> aspectj-users@

>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
> _______________________________________________
> aspectj-users mailing list

> aspectj-users@

> https://dev.eclipse.org/mailman/listinfo/aspectj-users


Alexander Kriegisch-2 wrote
> Hello.
>
> With all due respect: Ramnivas has answered the question before on SO
> quite patiently. So as not to waste any more of his precious time I
> recommend you to
>  - read his answer,
>  - think again, especially about Q1 and
>  - learn some basic Java.
>
> Sorry if it sounds rude, but you seem not to appreciate his answer, which
> is also not very nice.
>
> Regards
> Alexander
>
>
> Am 15.07.2013 um 20:40 schrieb pai &lt;

> pikapai@

> &gt;:
>
>> Hi! thanks for the response.
>>
>> But it seems you have some misunderstanding about my questions.
>>
>> So I made some modifications to make it clear.
>>
>> Thank you for the help :)
>>
>>
>>
>> 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 desc) {
>>           // TODO Auto-generated constructor stub
>>       }
>>   }
>>
>> The aspectJ code:
>>
>>   public aspect MyTest {
>>       public Child.new(String desc, int num) {
>>           System.out.println("Child Name:" + this.name);
>>       }
>>   }
>>
>> If I instantiate the Child with the new constructor:
>>
>>   new Child("A child", 5)
>>
>> the member variable **this.name** is not initialized as will be done with
>> the original constructor.
>>
>> But, if I call the original constructor:
>>
>>   new Child("A child")
>>
>> the member variable **this.name** will be initialized to "John" as usual
>>
>> 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 class which I'll add a new constructor to:
>>
>>   public class Child extends Parent{
>>
>>       public String name = "John";
>>
>>       public Child(String desc) {
>>
>>       }
>>   }
>>
>> **Child** extends **Parent**. **Parent** has a method **init()**
>>
>>   public class Parent {
>>
>>       public void init() {
>>           //....
>>       }
>>
>>   }
>>
>> I add a new constructor for the **Child** in my aspect.
>>   public aspect MyTest {
>>       public Child.new(String desc, int num) {
>>           super.init();
>>       }
>>   }
>>
>> The above aspect code will trigger an exception.
>>
>>   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)
>>
>> My workaround is to define **another method** for my class **Child**, and
>> indirectly call the super.method() within that method
>>
>>
>> For example, add a new method that calls **super.init()** for **Child**
>>
>>   public void Child.initState()
>>   {
>>       super.init();
>>   }
>>
>> Now, I can call initState() in the newly added constructor like below:
>>
>>   public aspect MyTest {
>>       public Child.new(String desc, int num) {
>>           this.initState();
>>       }
>>   }
>>
>> **Is this a limitation of AspectJ? Is this the only way to resolve this
>> issue?**
>>
>> Thank you all for your time :)
>>
>>
>>
>> --
>> View this message in context:
>> http://aspectj.2085585.n4.nabble.com/Behaviours-of-new-constructor-added-by-AspectJ-ITD-tp4651015p4651019.html
>> Sent from the AspectJ - users mailing list archive at Nabble.com.
>> _______________________________________________
>> aspectj-users mailing list
>>

> aspectj-users@

>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
> _______________________________________________
> aspectj-users mailing list

> aspectj-users@

> https://dev.eclipse.org/mailman/listinfo/aspectj-users





--
View this message in context: http://aspectj.2085585.n4.nabble.com/Behaviours-of-new-constructor-added-by-AspectJ-ITD-tp4651015p4651021.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