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