[AspectJ] Introduction

TommyMo

Erfahrenes Mitglied
Hi,

eine AOP-Frage. Ich verwende AspectJ um eine Klassenhirarchie mit einem bestimmten Interface zu erweitern. Den Aspekt habe ich schon geschrieben. Das zu erweiternde Interface soll lediglich eine Visitor-Funktionalität zu den einzelnen Klassen hinzufügen. Der Aspekt sieht wie folgt aus:

Code:
public aspect VisitorAspect {
	declare parents: target.*$Impl extends IVisitable;

	public void accept( IItemVisitor v ) {
		v.visit( this );
	}
}

Das Problem an der Sache ist, dass bei der Methode visit das aktuelle Objekt übergeben werden soll. Hier stoße ich auf meine Grenzen bei AspectJ.

Wie kann ich das aktuelle Element in diesem Aspekt herausbekommen?

Gruß
TOM
 
Hallo!

Ein ähnliches Problem hatte ich mal ein einem alten Beispiel vorgestellt:
http://www.tutorials.de/forum/java/233905-apectj-declare-parents.html?highlight=AspectJ

Schau mal hier:
Java:
package de.tutorials.aop.aspects;

import de.tutorials.aop.IVisitable;
import de.tutorials.aop.ItemVisitor;

/**
 * @author Tom
 *
 */
public aspect Visitable perthis(isDomainType()) {
    pointcut isDomainType(): within( de.tutorials.aop.domain.* );
    pointcut executeVistableAccept(ItemVisitor visitor): execution(public void IVisitable.accept(ItemVisitor)) && args(visitor);
    
    declare parents : de.tutorials.aop.domain.* extends IVisitable;
    
    public void IVisitable.accept(ItemVisitor visitor){
        //leer lassen...
    }
    
    before(ItemVisitor visitor) : executeVistableAccept(visitor) {
        visitor.visit(thisJoinPoint.getThis());
    }
}
thisJoinPoint.getThis() liefert dir die "advisedte" Instanz. thisJoinPoint ist jedoch nur dann verfügbar wenn wir uns wirklich in einem joinPoint befinden... das Problem bei dieser Vorgehensweise ist, dass er komplett ungetyped ist. thisJoinPoint.getThis() liefert nur Object zurück weshalb hier keine spezifischen Methoden des ItemVisitors angesprungen werden können:

Java:
/**
 * 
 */
package de.tutorials.aop;

import de.tutorials.aop.domain.Animal;
import de.tutorials.aop.domain.Human;

/**
 * @author Tom
 *
 */
public class ItemVisitor {
	public void visit(Human human){
		System.out.println("Human: " + human);
	}
	
	public void visit(Animal animal){
		System.out.println("Animal: " + animal);
	}
	
	public void visit(Object object){
		System.out.println("Object: " + object);
	}
}

Ergibt:
Object: de.tutorials.aop.aspects.Visitable@a83b8a
Object: de.tutorials.aop.aspects.Visitable@dd20f6

Das IVistable Interface ist leer:
Java:
/**
 * 
 */
package de.tutorials.aop;

/**
 * @author Tom
 *
 */
public interface IVisitable {

}

Das Beispiel:
Java:
/**
 * 
 */
package de.tutorials.aop;

import de.tutorials.aop.domain.Animal;
import de.tutorials.aop.domain.Human;

/**
 * @author Tom
 *
 */
public class IntroductionExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ItemVisitor visitor = new ItemVisitor();
		
		Human human = new Human("Tom");
		Animal animal = new Animal("Tiger");
		
		human.accept(visitor);
		animal.accept(visitor);
	}

}

Gruß Tom
 
Danke, Thomas,

wie damals funktioniert die Lösung leider nicht in meinem konkreten Fall. Danke Dir trotzdem. Werd mich weiter spielen.

Gruß
TOM
 
Hallo!

Dann poste doch mal ein lauffähiges minimales Anwendungsbeispiel (eclipse-projekt)... damit kann man vielleicht mehr anfangen.

Gruß Tom
 
Zurück