AspectJ : aspect has not been applied

Status
Nicht offen für weitere Antworten.

Merkosch

Mitglied
Hallo,
Wahrscheinlich ist es nur eine Kleinigkeit, aber ich sehe sie nicht. Ich habe den Code schon auf ein Minimum reduziert aber ich finde einfach den Fehler nicht!

Mein Problem: Ich arbeite mich gerade in AspectJ ein. Ich nutze Eclipse 3.2.2 mit AJDT 1.4.2 Plugin.

Ich habe ein Objekt Shape und alles was mein Aspekt machen soll ist am Objekt toString() aufzurufen nachdem es erstellt wurde und dies auszugeben.

Code:
aspect ConstructorLogger {
	
	pointcut objectConst(Shape s): target(s) && call( *.new(..) );
	
	after(Shape s): objectConst(s) {
	    System.out.println(s+" Object Created...");
	}
}

Er meldet einen Hinweis: advice defined in ConstructorLogger has not been applied [X|int:adviceDidiNotMatch]
Wenn ich die Übergabeparameter aus der Anweisung nehme funktioniert es!
So leider nicht . Was mache ich falsch?
 

Tobias

Top Contributor
So, ich hab das ganze mal umgebaut, hoffe, es ist so ok:

Code:
public class Shape {

	String name;

	public Shape(String name) {
		this.name = name;
	}

	public Shape() {
		this("irgendeine Form");
	}

	@Override
	public String toString() {
		return name;
	}

	private static final String[] names = new String[] { "Kreis", "Rechteck",
			"Quadrat" };

	public static void main(String[] args) {
		for (String s : names) {
			new Shape(s);
		}
	}

}

Code:
public aspect ConstructorLogger {
	
	pointcut objectConst(Shape s): execution( Shape.new(..) ) && this(s);
	   
	after(Shape s): objectConst(s) {
		System.out.println(s + " Object Created...");
	} 

}
 

Merkosch

Mitglied
Super danke!
Auf den execution währ ich nicht gekommen.
Ich stehe auch schon vor dem nächsten Problem. Scheinbar findet der Aspekt keine JoinPoints im Program. Das Objekt Shape hat eine Methode +getShape():String. Der Aspekt soll nur diesen Rückgabe-String ausgeben.
Was mache ich falsch?


Code:
public aspect Third {
	
	pointcut test(String s) : target(s) && call( * *.getShape(..) );
	
	after(String s) : test(s){
		System.out.println(s+" wurde erfragt!");
	}
	
}
 

Merkosch

Mitglied
Ich habe gerade herausgefunden, dass es funktioniert wenn ich String durch Object ersetze. Die Frage ist nun, da in Java alles von Object stammt was AspectJ da für ein Problem hat. Hat jemand Erfahrung mit deratigen Rückgabeparametern?
 

Merkosch

Mitglied
Also gut! Ich habe es herausgefunden.

Das Object in der Anweisung taget() ist wie call() oder execution() eine Bedingung. target() gibt an von welchem Objekt aus die Methode stammt! Was in diesem Fall Shape ist.

Soweit ich das sehe ist es in AspectJ nicht vorgesehen Rückgabewerte abzufangen oder auszulesen. Viel eher sollte man die Übergabewerte prüfen. Ich meine wenn mit after() ein return schon passiert ist kann man eh nichts mehr ändern und bei einem before() existiert noch kein return Wert!

Übergabeparamter können so ausgelesen werden:
Code:
pointcut intUeber(Dreieck d,int i, String s) : target(d) && args(i,s) && call( * *.setValue(int,String) );

after(Dreieck d, int i, String s) : intUeber(d,i,s)
{
	System.out.println(i+" "+s+" setValue!");
}

Zu Titel dieses Threads
Der Warnhinweis : advice defined in ConstructorLogger has not been applied [X|int:adviceDidiNotMatch]
wird immer dann eingeblendet wenn der Point-Cut keine JoinPoints finden kann, also nie aufgerufen wird.
 

Tobias

Top Contributor
Um einen Rückgabewert abzufangen kannst du entweder mit einem after-returning- oder einem around-Advice arbeiten:

Code:
pointcut executeGetShape : execution(public String getShape());

after() returning(String s) : excuteGetShape() {
    System.out.println(s);
}

oder

Code:
around() : executeGetShape() {
    String s = proceed();
    System.out.println(s);
}

Beides nicht getestet, aber grundsätzlich sollte es in etwa so gehen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M AspectJ Java Basics - Anfänger-Themen 0
K AspectJ - Join Points und Pointcuts. Unterschied? Java Basics - Anfänger-Themen 2
T testng.available" has not been set " Java Basics - Anfänger-Themen 6
Dimax ArayList may not have been initialized Java Basics - Anfänger-Themen 2
volcanos sun.audio has been removed from Java since JDK 9 Java Basics - Anfänger-Themen 2
R variable istpositiv might not have been initialized Java Basics - Anfänger-Themen 2
F javafx.fxml.LoadException: Root hasn't been set. Java Basics - Anfänger-Themen 0
R weiß jemand warum Java diesen Fehler ausspuckt? "Variable might not hav been initialized" Java Basics - Anfänger-Themen 4
G Fehlermeldung: A fatal error has been detected by the Java Runtime Environment Java Basics - Anfänger-Themen 7
H Problem: The local variable may have not been initialized Java Basics - Anfänger-Themen 4
C Variablen Problem: variable operator might not have been initialized Java Basics - Anfänger-Themen 9
H variable might not have been initialized Java Basics - Anfänger-Themen 6
M The local variable x may not have been initalized --> why Java Basics - Anfänger-Themen 6
E error in funktion:"variable might not have been initial Java Basics - Anfänger-Themen 7
S Compiler: Variable might have not been initialized Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben