tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
485
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Hallo!

    Wir entwickeln eine Webanwednung mit Eclipse + JBoss + sehr vielen Projekten.

    Nun wollen wir produktiv einige Sachen mitloggen.
    Hierfür habe ich mir AspectJ angesehen und auch einiges hin bekommen.

    Nun stehe ich aber vor einem kleinen Problem.

    Zuerst einmal eine Frage ob das so richtig ist?:
    Wir haben ein eigenes AspectJ-Projekt wo wir ein ein .aj-File haben wo alle Pointcuts und Advises drin sind.
    Alle Projekte von unserer Anwendung welche geloggt werden sollen hab ich in AspectJ-Projekte umgewandelt und unter Projekt-Properties - AspectJ Build - Aspect Path füge ich das AspectJ-Projekt mittels Add Project ein.

    Wenn ich dann das EAR erstelle funktioniert alles und es werden auch die Methoden die ich angegeben habe geloggt.

    Nun die eigentliche Frage...wie kann ich auf private variablen einer Klasse zugreifen?


    Hier ein kurzes Bespiel:

    Projekt1:
    Test.java
    TestAspect.java

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    public class Test
    {
        private String thePrivateVariable = "1234";
        
        public void testit(String msg) 
        {
            System.out.println("Bin ein Test");
            System.out.println(thePrivateVariable + " | " + msg);
        }
    }

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    public class TestAspect {
     
        /**
         * @param args
         */
        public static void main(String[] args) 
        {
                    Test te = new Test();
            te.testit("zahl");
        }

    Projekt2:
    World.aj

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    public privileged aspect World { 
     
        pointcut testlog( String string) : ( execution( * testit(String)) && args(string));
        
        Object around( String string ) : testlog( string)
        {
            Object result;
            
            result = proceed(string);
            
            System.out.println("Im Aspect | msp : " + string);
     
            // Zugriff auf Test.thePrivateVariable ?
            
            return result;
            
        }
    }

    In Project1 gebe ich in Aspect Path das Project2 an.

    Wie kann ich nun im den around-Advise auf die private Variable thePrivateVariable zugreifen?

    Den Aspect (World.aj) wollen wir nicht in das selbe Projekt geben da wir ja genau ein Projekt haben wollen wo die Aspects drin sind und somit die anderen Projekte kaum ändern müssen.

    Vielen Dank für die Hilfe!
    mfg
     

  2. #2
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Hat jemand eine Idee?
     

  3. #3
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    versuchs doch mal mit nem priviledged Aspect:
    http://tinyurl.com/2utboz9

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  4. #4
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Hallo,

    die URL funktioniert leider nicht.

    Aber wir verwenden den priviledged Aspect schon. Nur weiß ich leider nicht wie ich den poincut gestalten bzw den advise gestalten soll sodass er auf die private Variable zugreifen kann.

    lg
     

  5. #5
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Hat noch jemand eine Idee?
     

  6. #6
    genodeftest genodeftest ist offline Mitglied Brillant
    Registriert seit
    Jun 2009
    Beiträge
    870
    @hesk
    Die URL funktioniert - zumindest bei mir
     
    Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  7. #7
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Ja..die URL funktioniert bei mir nun auch.

    Aber wie schon gesagt... wir verwenden schon priviledged Aspect.
    Wir wissen nur nicht wie man auf eine private Variable zugreifen können(siehe Beispiel ganz oben)
     

  8. #8
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    hier mal ein kleines Beispiel:
    Mit 3 Projekten: test1 (Anwendungsklassen), testaspects (Aspekte), test2 (Runtime)

    In test1:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    package de.tutorials;
     
    public class Service {
      
      private String state = "starting";
      
      public void run(){
        System.out.println("Service... " + state ); 
      }
      
      public static void main(String[] args) { 
        new Service().run(); 
      }
    }

    In testaspects:
    Java Build Path: test1

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    package de.tutorials.example;
     
    import de.tutorials.Service;
     
    public privileged  aspect TestAspect {
      pointcut run(Service service) : ( execution( * de.tutorials.Service.run(..)) && target(service));
     
     
      Object around(Service service) : run(service){
        try {
          System.out.println("Before");
     
          System.out.println("In Aspect: " + service.state);
     
          return proceed(service);
        } finally {
          System.out.println("After");
        }
      }
    }

    In test2:

    AspectJ Build:
    Inpath: test1
    Aspect Path: testaspects

    Code java:
    1
    2
    3
    4
    5
    6
    7
    
    package de.tutorials;
     
    public class Main {
      public static void main(String[] args) {
        new Service().run();
      }
    }

    Ausgabe:
    Code :
    1
    2
    3
    4
    
    Before
    In Aspect: starting
    Service... starting
    After

    Gruß Tom
    Angehängte Dateien Angehängte Dateien
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

Ähnliche Themen

  1. Logging mit AspectJ in Eclipse
    Von xxxAnnaxxx im Forum Java
    Antworten: 2
    Letzter Beitrag: 23.11.10, 21:17
  2. AspectJ und Eclipse
    Von xxsaikoxx im Forum Java
    Antworten: 3
    Letzter Beitrag: 15.11.10, 09:41
  3. AspectJ PointcutDoctor für die Eclipse IDE
    Von Thomas Darimont im Forum Java
    Antworten: 1
    Letzter Beitrag: 31.01.09, 17:11
  4. Antworten: 6
    Letzter Beitrag: 05.11.08, 15:16