There seems to be a bug in the AspectJ compiler.

With your code as is, I see the same error, but there is also a warning ("-
inter-type constructor does not contain explicit constructor call: field
initializers in the target type will not be executed
[Xlint:noExplicitConstructorCall]". Then I modified the ITD declaration as
follows:

    public Child.new(String name, int age) {
        this(name);
        super.getJob();//This seems to cause issues at runtime
    }

The causes another error:
Exception in thread "main" java.lang.ClassCastException: java.lang.String
can not be converted to int
at org.aspectj.runtime.internal.Conversions.intValue(Conversions.java:57)
at example.Child.<init>(Parent.java:1)
at example.Main.main(Main.java:5)

BTW, my Main class is as follows:

public class Main {
public static void main(String[] args) {
new Child("myname", 5);
}
}


Can you file a bug so that it may be addressed? I am using the
1.7.3.20130613 version.

-Ramnivas


On Wed, Jul 17, 2013 at 7:17 AM, pai <pika...@gmail.com> wrote:

> It seems *super.someMethod()* can not be correctly resolved in the
> constructor added by ITD
>
> It can be compiled with no problem, but* at runtime, exception is raised.*
>
>
> The class which I'll add a new constructor to:
>
> *    public class Child extends Parent{
>
>         public String name = "John";
>
>         public Child(String name) {
>             this.name = name;
>         }
>     } *
>
> As we can see, *Child * extends *Parent*
>
> class Parent has a method *getJob()*
>
> *public class Parent {
>         private int mJob = 0;
>
>         public int getJob() {
>             return mJob;
>         }
>
>     }*
>
> If I add a new constructor for the *Child * in my aspect.
>
> *    public aspect MyTest {
>         public Child.new(String name, int age) {
>             super.getJob();//This seems to cause issues at runtime
>         }
>     }*
>
> 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)*
>
> *Is this a limitation of AspectJ? Is this the only way to resolve this
> issue?*
>
> *My workaround:*
> Define* another wrapper method* for class *Child*, and indirectly call the
> *super.getJob() * via that wrapper method
>
>
> For example, use ITD to add a new method for class *Child*
>
>     public int Child.getJobWrapper()
>     {
>         super.getJob();
>     }
>
> Now, I can call *getJobWrapper*() from the newly added constructor like
> below:
>
>     public aspect MyTest {
>         public Child.new(String desc, int num) {
>             *this.getJobWrapper();* //This will help me call the getJob()
> in
> super class
>         }
>     }
>
>
>
> Thank you all for your time :)
>
>
>
> --
> View this message in context:
> http://aspectj.2085585.n4.nabble.com/ITD-constructor-access-methods-defined-in-super-class-tp4651029.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

Reply via email to