AspectJ + Eclipse + Mehrere Projekte + Zugriff auf private Variable

hesk

Erfahrenes Mitglied
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:
public class Test
{
	private String thePrivateVariable = "1234";
	
	public void testit(String msg) 
	{
		System.out.println("Bin ein Test");
		System.out.println(thePrivateVariable + " | " + msg);
	}
}

Code:
public class TestAspect {

	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{
                Test te = new Test();
		te.testit("zahl");
	}

Projekt2:
World.aj

Code:
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
 
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
 
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)
 
Hallo,

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

In test1:
Java:
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

Java:
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

Java:
package de.tutorials;

public class Main {
  public static void main(String[] args) {
    new Service().run();
  }
}

Ausgabe:
Code:
Before
In Aspect: starting
Service... starting
After

Gruß Tom
 

Anhänge

Zurück