AspectJ und Eclipse

xxsaikoxx

Grünschnabel
Hi,
ich hoffe irgendwer hier kennt sich ganz gut mit AspectJ aus.
Ich brauche AspectJ nur für eine kurze Demonstration (also ein kleines Beispiel).

Ziel ist es, ein vorhandenes Beispiel mit verschiedenen Aspects zu kompilieren und dabei halt die Möglichkeiten von AspectJ zu zeigen.

Mein Problem ist nun folgendes: Ich habe ein AspectJ Projekt in Eclipse angelegt und kann auch dort Aspects schreiben. Jedoch verwendet Eclipse beim "Ausführen als AspectJ Anwendung" automatisch alle im Projekt vorhandenen Aspects. Ich möchte aber nur selektiv ein Aspect aus dem Projekt benutzen.

Gibt es irgendeine Möglichkeit dazu ohne Ant zu benutzen?
Ich habe mir schon versucht eine build.xml zu suchen und dann anzupassen. Bin dabei aber leider kläglich gescheitert. ;-(

Ich nutze AJDT 1.5 und Eclipse 3.3.

Danke schonmal für eure Hilfe.
 
Hallo,

machst du Compiletime Weaving oder Load-Time weaving.
Beim Loadtime Weaving kannst du über das aop.xml im META-INF Verzeichnis die verwendeten Aspects beeinflussen.

Wenn du compiletime weaving verwendest dann kannst du folgendes machen:
Java:
/**
 * 
 */
package de.tutorials.aspectj.training;

import java.util.concurrent.TimeUnit;

/**
 * @author Thomas.Darimont
 */
public class Main {

  /**
   * @param args
   */
  public static void main(String[] args) {
    System.out.println(
        businessMethod()
      );
  }


  public static int businessMethod() {
    try {
      TimeUnit.MILLISECONDS.sleep(250);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return 42;
  }

}

AbstractAspect:
Java:
package de.tutorials.aspectj.training.aspects;

public abstract aspect AbstractAspect {
  protected pointcut methodCall() : call(* de.tutorials.**..*(..)) && !within(de.tutorials.aspectj.training.aspects.**.*);
  
  public static boolean isEnabled(Class<?> aspectClass){
    return Boolean.getBoolean(aspectClass.getName());
  }
}


Tracing:
Java:
/**
 * 
 */
package de.tutorials.aspectj.training.aspects;

/**
 * @author Thomas.Darimont
 *
 */
public aspect Tracing extends AbstractAspect {
  before() : if(isEnabled(Tracing.class)) && methodCall(){ 
    System.out.println(thisJoinPoint);
  }
}

Profiling:
Java:
/**
 * 
 */
package de.tutorials.aspectj.training.aspects;

/**
 * @author Thomas.Darimont
 */
public aspect Profiling extends AbstractAspect {
  Object around() : 
    if(isEnabled(Profiling.class)) 
    && 
    methodCall()
    {
    long time = -System.currentTimeMillis();
    Object result = proceed();
    time += System.currentTimeMillis();
    System.out.println(String.format("Execution of: %s took %s ms", thisJoinPoint, time));
    return result;
  }
}

Über die JVM Parameter:
-Dde.tutorials.aspectj.training.aspects.Tracing=true
-Dde.tutorials.aspectj.training.aspects.Profiling=true

kann man so beim Start der Anwendung die beiden Aspects entsprechend an- / ausschalten.

Ausgabe:
mit aktiviertem Tracing / Profiling
Code:
call(int de.tutorials.aspectj.training.Main.businessMethod())
Execution of: call(int de.tutorials.aspectj.training.Main.businessMethod()) took 250 ms
42

Gruß Tom
 
Hallo,

ich arbeite mich gerade in das Thema Aspektorientierung ein. Die Theorie ist soweit klar, aber mein Projekt will einfach nicht laufen, weil ich den Pointcut nicht richtig implementiert bekomme.

Mein Projekt besteht aus einer Klasse Mitarbeiter, einer ausführenden Klasse Mitarbeiterverwaltung und dem Aspekt. Der Aspekt soll jede Änderung die an einem Objekt Mitarbeiter vorgenommen wird Loggen.
Vielleicht kann mir ja hier jemand helfen.

Code:

Mitarbeiter
package de.eufh.wi09;

public class Mitarbeiter {

private String name;
private String vorname;
private int gehalt;
private String abteilung;

public Mitarbeiter(String n, String v, int g, String a) {
this.name = n;
this.vorname = v;
this.gehalt = g;
this.abteilung = a;
}

public void MitarbeiterGehaltErhoehen(int Erhoehung) {
this.gehalt = gehalt + Erhoehung;
}

public void MitarbeiterAbteilungWechseln(String NeueAbteilung)
{
this.abteilung = NeueAbteilung;
}

}




Mitarbeiterverwaltung

package de.eufh.wi09;


public class Mitarbeiterverwaltung {

public static void main (String [] args)
{

// Instanziierung eines Objektes
Mitarbeiter aKowollik = new Mitarbeiter ("Kowollik","Anna",200000,"CEO");

// Anwendung der Methode GehaltErhoehen
aKowollik.GehaltErhoehen(50000);

// Anwendung der Methode AbteilungWechseln
aKowollik.AbteilungWechseln("Process Management");
}

}





package de.eufh.wi09;

public aspect Logging {

pointcut Log () : call (void GehaltErhoehen(..))
&& call (void AbteilungWechseln(..));


before (): Log ()
{
System.out.println("Erstelle/ Bearbeite Text:");
}

after (): Log ()
{
System.out.println("Text wurde erstellt/ bearbeitet.");
}
}



Der Aspekt spricht weder die richtigen Methoden an, noch Loggt er die Änderungen.
Wie muss ich das implementieren?



Viele Grüße,
Anna
 
Zurück