Hello,

Thank you for your detailed answer!

I don't think I may explain our situation.
All I can say is that I'm looking for the least painful shortcut. Now I
know that this is not AspectJ.
So I keep looking.

Thanks,
Tamas

On Tue, Jun 18, 2019 at 3:57 AM Alexander Kriegisch <
[email protected]> wrote:

> The problem is not privileged access, you are rather dealing with a
> *hen-and-egg* type of problem here. Let's imagine you want a setup like
> this:
>
>    - Aspect library (to be used via LTW)
>       - AspectPrivate
>    - Application
>       - ClassWithPrivate
>       - TestPrivate
>
> Now probably you don't want any dependencies between aspect library and
> application, but
>
>    - the aspect imports an application class,
>    - the test program is trying to access methods unavailable during its
>    compile time,
>    - thus the aspect library has a dependency on the application library
>    and vice versa.
>
> Ergo: It simply does not make sense to use AspectJ's introduction feature
> (also known as ITD or inter-type declaration) like this in an LTW scenario.
> In most cases AOP is about adding cross-cutting behaviour and there you can
> work with jokers like "*" or "..", i.e. you do not need to use precise
> class names. Even if you do, the worst that could happen is an "advice does
> not match" warning during compilation of the aspect library. It would still
> work during runtime after aspect weaving. But member access and/or method
> introduction only work with specific class names, so if you need that you
> should use compile-time weaving. Think about it, you are not just
> decorating classes with behaviour before or after existing methods, you are
> introducing new members or methods, i.e. changing the class structure
> itself. This is to be done during compile time.
>
> So much for the technical part. I still think your question might be
> suffering from the XY problem
> <https://meta.stackexchange.com/a/66378/309898>. Maybe you should rather
> explain *what* you want to achieve and not *how* you think it should best
> be achieved. Ask yourself questions like:
>
>    - Why would I want to access private class members in the first place?
>    - What happens if I refactor the target class, e.g. rename a member?
>    (In your example the aspect would break and need to be refactored too.)
>    - Why am I limited to LTW here? Or maybe I just think I am and there
>    are other possible solutions.
>    - What is it I want to achieve? (Maybe your answer is: "I want to
>    reduce boiler-plate code and auto-generate getters and setters for all or
>    some of my beans." And maybe then you find out that you could do that via
>    AspectJ's annotation processing feature or by using another tool such as
>    Lombok or by using Groovy instead of Java or ...)
>
> Kind regards
> --
> Alexander Kriegisch
> https://scrum-master.de
>
>
> REV Tamas schrieb am 17.06.2019 18:35:
>
> Hello,
>
> I would like to use a privileged access and weave it at load-time.
> I did not see anywhere that it was not possible to do so.
> On the other hand, I could only make it work with compile-time weaving so
> far.
> Could you please help me to make it work (or just tell me it is not
> possible)?
>
> I was playing with this mock project:
> https://stackoverflow.com/questions/10721037/aspectj-access-private-fields
> Code excerpt:
>
> public class ClassWithPrivate {
>     private String s = "myStr";
> }
>
> ==========
> package com.example.aspect;
> import com.example.ClassWithPrivate;
>
> privileged public aspect AccessPrivate {
>
>     public String ClassWithPrivate.getS() {
>         return this.s;
>     }
>
>     public void ClassWithPrivate.setS(String str) {
>         this.s = str;
>     }
> }
>
> ==========
> package com.example;
> public class TestPrivate {
>
>     public static void main(String[] args) {
>
>         ClassWithPrivate test = new ClassWithPrivate();
>         System.out.println(test.getS());
>         test.setS("hello");
>         System.out.println(test.getS());
>     }
> }
>
>
> I installed ADT to eclipse and now I can see the aspect weaved into the
> bytecode.
> I saw this when I decompiled the code:
> public class ClassWithPrivate
> {
>   public void setS(String paramString)
>   {
>
> AccessPrivate.ajc$interMethod$com_example_aspect_AccessPrivate$com_example_ClassWithPrivate$setS(this,
> paramString);
>   }
>
>   public String getS()
>   {
>     return
> AccessPrivate.ajc$interMethod$com_example_aspect_AccessPrivate$com_example_ClassWithPrivate$getS(this);
>   }
>
>   private String s = "mystr";
> }
> So here is the question: Is it possible to do it with load-time weaving?
> I disabled ADT, then I added the aspect to the aop.xml as I normally do.
> However,
> the class that tried to access the privileged methods, that gave a compile
> error.
>
> Thanks,
> Tamas
>
> _______________________________________________
> aspectj-users mailing list
> [email protected]
> To change your delivery options, retrieve your password, or unsubscribe
> from this list, visit
> https://www.eclipse.org/mailman/listinfo/aspectj-users
_______________________________________________
aspectj-users mailing list
[email protected]
To change your delivery options, retrieve your password, or unsubscribe from 
this list, visit
https://www.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to