Skip to main content

[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,

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



Back to the top