[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Accessing protected methods of parent class from within an aspect in another package

Hi Andy,

That worked. 
An I can now call those protected methods from the parent class and it gets compiled and the code runs.
But I still get that warning from Eclipse. 
Dont' know what's wrong with Eclipse...

cheers,
Sina
 

On May 25, 2012, at 1:07 AM, Andy Clement wrote:

> Hi,
> 
> This does characterise exactly what you are hitting:
> 
>> As it seems "ajc" can not weave the code into the parent class since it is in another project.
> 
> The accessor needs to be added to the parent and we can't do that
> because we haven't been given access to it.  And that, indeed, is what
> the message is telling us:
> 
> "This affected type is not exposed to the weaver: com.somewhere
> (needed for privileged access [Xlint:typeNotExposedToWeaver])"
> 
> I can imagine a modification to the weaver that attempted to add the
> accessor solely at the point in the hierarchy that needed it (so into
> 'Child' in my example).
> 
> But to get you going now, really, you have to provide the weaver
> access to make that change to Parent.  This would involve putting the
> library containing the parent on the inpath rather than the classpath.
> I think in maven terms this gets called 'weaveDependencies' in your
> pom setup.  If you put the library on there that contains Parent it
> will get woven into the same output folder as the current
> compile/weave step and have the accessor added.
> 
> cheers,
> Andy
> 
> On 24 May 2012 11:17, Sina <my.linked.account@xxxxxxxxxxxxxx> wrote:
>> Hi Andy,
>> 
>> First of all: the autocomplete function in my IDE (Eclipse 3.7.1) does not list the protected method as child's methods. (Is this the normal behavior?)
>> Second : when I write c.foo() in my aspect I get this warning from eclipse:
>> 
>> "This affected type is not exposed to the weaver: com.somewhere (needed for privileged access [Xlint:typeNotExposedToWeaver])"
>> there are some differences between your config and mine.
>> 
>> 1- Instead of exposing the Child class I'm exposing the parent class.
>> I don't think that should be problem, since I tried exposing both of classes in a dummy project and that has worked.
>> 
>> 2-I'm using maven and I have different modules. My aspect and the child class are in the same maven module, but the Parent is in another module.
>> The output of the parent module will be provided as a jar file to the module in which the child exists. (using dependencies in pom.xml)
>> 
>> As it seems "ajc" can not weave the code into the parent class since it is in another project.
>> If this is true, do you suggest any solution? (can I weave it into the jar file ? somehow?)
>> 
>> 
>> Cheers,
>> Sina
>> 
>> 
>> 
>> 
>> 
>> On May 22, 2012, at 8:48 PM, Andy Clement wrote:
>> 
>>> Hi Sina,
>>> 
>>> That should work, the use of 'privileged' should cause generation of
>>> an accessor method that can then be used by the aspect.
>>> 
>>> here is my sample:
>>> 
>>> ==== 8< ==== Parent.java
>>> package com.somewhereelse;
>>> 
>>> public class Parent {
>>> 
>>>       protected void foo() {
>>>               System.out.println("foo!");
>>>       }
>>> }
>>> ===== 8< ====
>>> ===== 8< ==== Child.java
>>> package com;
>>> 
>>> import com.somewhereelse.Parent;
>>> 
>>> public class Child extends Parent {
>>> 
>>>       public static void main(String[] args) {
>>>               new Child().m();
>>>       }
>>> 
>>>       public void m() {
>>> 
>>>       }
>>> }
>>> ===== 8< ==== Overthere.aj
>>> package xxx;
>>> import com.Child;
>>> 
>>> privileged aspect Overthere {
>>> 
>>>       before(Child c): execution(* Child.m(..)) && this(c) {
>>>               c.foo();
>>>       }
>>> }
>>> ===== 8< ====
>>> 
>>>> ajc -1.5 com/Child.java com/somewhereelse/Parent.java xxx/Overthere.aj -showWeaveInfo -d output
>>> 
>>> Join point 'method-execution(void com.Child.m())' in Type 'com.Child'
>>> (Child.java:11) advised by before advice from 'xxx.Overthere'
>>> (Overthere.aj:6)
>>> 
>>>> cd output
>>>> java com.Child
>>> foo!
>>> 
>>> Here is the accessor in the Parent class:
>>> 
>>>> javap com.somewhereelse.Parent
>>> Compiled from "Parent.java"
>>> public class com.somewhereelse.Parent extends java.lang.Object{
>>>    public com.somewhereelse.Parent();
>>>    protected void foo();
>>>    public void ajc$privMethod$xxx_Overthere$com_somewhereelse_Parent$foo();
>>> }
>>> 
>>> So what is different about your configuration from mine?
>>> 
>>> cheers,
>>> Andy
>>> 
>>> On 21 May 2012 09:25, Sina <my.linked.account@xxxxxxxxxxxxxx> wrote:
>>>> Hi there.
>>>> 
>>>> I have Parent class and a child one. The parent class has
>>>> some protected  methods.
>>>> My pointcut works on methods of the child class. The problem is that I want
>>>> to access protected methods of the parent in my Aspect, but they are not
>>>> visible from within my Aspect.
>>>> 
>>>> All these 3 classes (Parent, Child, Aspect) are in different packages.
>>>> 
>>>> I read here http://dev.eclipse.org/mhonarc/lists/aspectj-users/msg03270.html
>>>> that using privileged  modifier will solve the problem but it does not work
>>>> for me.
>>>> Any idea??
>>>> 
>>>> Sina
>>>> 
>>>> _______________________________________________
>>>> aspectj-users mailing list
>>>> aspectj-users@xxxxxxxxxxx
>>>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>>>> 
>>> _______________________________________________
>>> aspectj-users mailing list
>>> aspectj-users@xxxxxxxxxxx
>>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>> 
>> _______________________________________________
>> aspectj-users mailing list
>> aspectj-users@xxxxxxxxxxx
>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users