Java Syntax Tree erstellen (oder anderweitig Methodenaufrufe erkennen)

Guten Morgen allerseits,

ich habe folgendes Problem: ich muss automatisiert herausfinden, ob die Methode einer Klasse in einer anderen Klasse aufgerufen wird.

Meine bisherigen Ideen:
Zum Einen habe ich mir gedacht, einen AST zu erstellen und aus diesem dann auszulesen ob die gesuchte Methode in dieser Klasse aufgerufen wird. Als APIs habe ich in diesem Zusammenhang ANTLR ausprobiert, das scheint aber nicht automatisiert zu klappen. Zumindest habe ich nur manuell ausgeführte Beispiele und Tutorials gefunden.

Zum Anderen habe ich mich mit BCEL beschäftigt. Nur scheint es mir dort nicht möglich Methodenaufrufe überhaupt zu erkennen. Vielleicht habe ich es auch übersehen (es muss ja im ByteCode zu finden sein…)

Hat sich jemand von euch schonmal mit Syntax Trees oder der identifizierung von Methodenaufrufen beschäftigt?
Kann mir da jemand Tipps geben?

Vielen Dank im Voraus.

  • Bale

ANTLR ist … nicht so … “zugänglich”, zumindest hatte ich mal in Betracht gezogen, es mir näher anzusehen, aber es scheint doch recht komplex.
Mit BCEL müßte das eigentlich gehen. Überall, wo ein invokespecial/invokestatic/invokevirtual vorkommt, wird eine Methode aufgerufen.
Ein anderer Ansatz wäre wirklich AST-Basiert, aber mit den Mitteln, die JDT http://www.eclipse.org/jdt/ bietet. Genaugenommen, sollte das mit einem Eclipse-Plugin vergleichsweise (!) einfach sein. Eine ähnliche Frage tauchte neulich hier auf: http://forum.byte-welt.net/threads/9920-Ermitteln-welche-Sourcen-in-einem-Paket-wirklich-verwendet-werden

Mit ASM geht das auf jeden Fall ziemlich einfach. Auf die schnelle zusammengehackt (und komplett ungetestet) müßte das etwa so in der Art gehen:

	public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) 
	{
		return new MethodVisitor(Opcodes.ASM4) {
			public void visitMethodInsn(int opcode, String owner, String name, String desc)
			{
				// hier irgendetwas mit den Infos zu den aufgerufenen Methoden machen
			}
		};
	}
}, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);```

Mit BCEL habe ich mich noch nicht beschäftigt. Hab ja mit ASM ne sehr gute Alternative mit der ich schon ein paar Jahre geabeitet habe.

Erstmal danke für erue Antworten. :slight_smile:

Ja mit ASM hatte ich beim weitergooglen auch einen sehr viel versprechenden Kandidaten gefunden. Ich hatte das mit dem Code mal ausprobiert und es läuft wunderbar.

Das einzige was mir fehlt ist, dass ASM mit den Einstellungen nicht erkennt, wenn eine Methode aus einem Interface heraus aufgerufen wird.
Beispiel:

IEinInterface in = new MyClass();
in.method();

Wenn so etwas noch möglich ist wär das perfekt. :slight_smile:

Hast du in diese Richtung schon Erfahrung?