Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] How? Reflective access on a private method introduced by an inter-type declaration

Hi Thomas,

I actually thought the AjTypeSystem would allow this. But having just
tried it, I see that it doesn't !

The name is stable.  (it is computed by AspectJs
org.aspectj.weaver.NameMangler.interMethod() which is contained in the
weaver jar).  So you could create it yourself or simply look for the
method name that starts with 'ajc$' and ends with '$getName'.

However, there is also an annotation added to these mangled members,
which captures the declared name.  Here is some code that shows how to
access it:

public class Person {
  private String name;

  public static void main(String[] args) {
	Method[] ms = Person.class.getDeclaredMethods();
	for (int i=0;i<ms.length;i++) {
		ajcITD ajcITD =
ms[i].getAnnotation(org.aspectj.internal.lang.annotation.ajcITD.class);
		if (ajcITD!=null) {
		  System.out.println("method = "+ms[i].getName()+"  has real
name="+ajcITD.name());
		}
	}
  }
}

privileged aspect Person_ITD {
	public String Person.getName() {
		return name;
	}
}


For the mangled method, that prints:

method = getName  has ajcitd=getName


cheers,
Andy

On 17 May 2010 15:26, Thomas Wieger <thomas.wieger@xxxxxx> wrote:
>
> Hello!
>
> I'm just wondering, how i could invoke a private method introduced by an inter-type declaration via java reflection (method#invoke(...)) using the aspectj runtime infrastructure, possibly the AjTypeSystem.
>
> What i want to do is something like this. Suppose i have a class Person, which looks like this:
>
> class Person {
>   private String name;
> }
>
> now i declare an inter-type:
>
> privileged aspect Person_IDT {
>   private String Person.getName()  {
>       return name;
>   }
> }
>
> now i would like to do something like this:
>
> Method readMethod = Person.class.getDeclaredMethod("getName");
> readMethod.setAccessible(true);
> readMethod.invoke(aTarget);
>
> Actually i know, that i won't find the method in this way, because AspectJ mangles the name to something beginning with "ajc$interMethodDispatch2$". But my hope was, that somewhere in the aspectj runtime, there would be some way to achieve something like previously described. Unfortunately i haven't found a way.


Back to the top