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 <pika...@gmail.com>: > 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@eclipse.org > https://dev.eclipse.org/mailman/listinfo/aspectj-users _______________________________________________ aspectj-users mailing list aspectj-users@eclipse.org https://dev.eclipse.org/mailman/listinfo/aspectj-users