# wie static aber doch nicht ...



## tsitra (9. Jul 2014)

Hallo  allerseits,

in einem Spring-Projekt, welches auch Maven und Spring Roo 
einsetzt, habe ich in einer class Testclass100,
die mit folgenden Annotationen 

@ManagedBean(name = "Testclass100")
@SessionScoped
public class Testclass100 {...}

versehen ist, in einer Methode 
public String testMethode300(){...}
eine folgende Anweisung (Aufruf? mit Rückgabe an allElements?)

*allElements = Testclass200.testMethode300()*

entdeckt und erst mal gedacht testMethode300() sei static in Testclass200,
doch testMethode300() gibt es gar nicht in Testclass200.

(Hinweis:  testMethode300() ist als Problem/Fehler markiert:
"The method testMethode300() is undefined for the type Testclass200"
Die Eclipse IDE bietet eine Lösung [1 quick fix available], die da lautet:
Create method 'testMethode300()' in type 'Testclass200')

Kann mir ein Spring-Experte erklären, was das für eine Ursache hat bzw.
was diese Anweisung genau bedeutet und wie sie funktioniert?

Gruß,
tsitra


----------



## redJava99 (9. Jul 2014)

> doch testMethode300() gibt es gar nicht in Testclass200.



Wenn die Methode nicht da ist, funktioniert die Anweisung nicht. Und die IDE beschwert sich zu Recht. Was gibt es da noch für Unklarheiten?


----------



## tsitra (9. Jul 2014)

Hallo,

die Unklarheit besteht darin, dass *trotzdem* in der Eclipse IDE unter "Run" (Goals: "deploy" etc.) die Sourcen kompiliert werden und eine xy.war Datei erzeugt wird, die
im tomcat, also als web-Anwendung , gut funktioniert!

Gruß,
tsitra


----------



## taro (9. Jul 2014)

... weil es sich dabei wahrscheinlich nur um einen Test handelt, welcher für den build nicht relevant ist.


----------



## tsitra (9. Jul 2014)

Hallo taro,
Dein Beitrag verstehe ich nicht.

Hinweis:
class Testclass100  in  Testclass100.java wird zu Testclass100.class und ist auf jeden Fall produktiv und hat nicht den Zweck irgendwas zu testen.
Es wird auch kein JUnit Test eingesetzt.
(Natürlich sind meine Namen nicht die Originalnamen!)

Gruß,
tsitra


----------



## taro (9. Jul 2014)

Dann muss ich noch einmal nachfragen:

Du bist dir absolut sicher, dass betroffener Code auch während der Ausführung zur Geltung kommt?

Es ist ohne weiteres Möglich, auch fehlerhaften Code zum laufen zu bringen

Kleines Beispiel:

```
public class Testabc {

    public static void main(String[] args) {
        Test1 t = new Test1();
        System.out.println("Alles OK");
    }
}

class Test1 {
    public void irgendwas() {
        ichBinNichtDa();
    }
}
```

so lange ich nicht 
	
	
	
	





```
irgendwas()
```
 aufrufe, funktioniert alles wunderprächtig.

Also bitte noch einmal genau nachprüfen, ob der von dir genannte Abschnitt wirklich auch zur Ausführung kommt!


----------



## tsitra (9. Jul 2014)

Hi taro,
Danke für den Hinweis.
Dass es "toten Code" und gibt, der problemlos kompiliert wird, ist soweit klar.

Unmittelbar, also direkt, vor 
*allElements = Testclass200.testMethode300();*
habe ich ein
System.out.println("In public String testMethode300(){...} 
V O R  allElements = Testclass200.testMethode300();");
platziert, welches definitiv zur Laufzeit ausgeführt wird, denn die Meldung erscheint auf der 
Ausgabe-Konsole vom tomcat. Es besteht keinerlei Grund zur Annahme
warum die mysteriöse Anweisung, die direkt danach steht, nicht ausgeführt werden sollte.

Deshalb bin ich mir sicher, dass 
*allElements = Testclass200.testMethode300()[;/B]
ausgeführt wird.

(Außerdem: Tatsächlich haben die Anweisungen auch "sprechende Namen" und es passiert auch das
was der tatsächliche Name von testMethode300(){...} aussagt.)


Viele Grüße,
tsitra*


----------



## taro (9. Jul 2014)

OK, dann bin ich, zumindest ohne konkretem Code, raus - der nächste darf sein Glück versuchen ;-)


----------



## tsitra (9. Jul 2014)

Hallo taro,

eine Antwort habe ich zwischenzeitlich gefunden.

Der Ausdruck
*Testclass200.testMethode300();*

befindet sich in einer Datei  xy_Roo_Jpa_ActiveRecord.aj :


privileged aspect xy_Roo_Jpa_ActiveRecord {

    @PersistenceContext
    transient EntityManager xy.entityManager;
...

public static List<xy> Testclass200.testMethode300();{
        return entityManager().createQuery("SELECT o FROM xytable o WHERE x = 2", xy.class).getResultList();
    }

...

Es geht um aspektorientierte Programmierung und Spring Roo
und dadurch ist so etwas wie 
*allElements = Testclass200.testMethode300()* erlaubt, obwohl es 
testMethode300() gar nicht in Testclass200 gibt.
(wie ich anfangs zur Diskussion gestellt habe.)

Da gibt's noch was zu lernen für mich ...

Gruß,
tsitra


----------

