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

You could raise a bugzilla for the enhancement.  I can't see it
getting implemented imminently though, unless someone provides me the
testcases and patch to implement it.

cheers
Andy

On 19 May 2010 00:18, Thomas Wieger <thomas.wieger@xxxxxx> wrote:
> Hi Andy,
>
> thanks a lot for your answer. I like the annotation based approach. This would allow me, not having to deal with the mangled names.
> Is there any chance, that AjType gets enhanced to directly provide the stuff i would need?
>
> best regards,
>
> Thomas
> On May 18, 2010, at 1:40 AM, Andy Clement wrote:
>
>> 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.
>> _______________________________________________
>> 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