javassist API Klasse in MethodCall ermitteln

Diskutiere javassist API Klasse in MethodCall ermitteln im Allgemeine Java-Themen Bereich.
D

Daniel87

Hallo, ich habe folgende Code:
CtMethod cm = ... ;
cm.instrument(
new ExprEditor() {
public void edit(MethodCall m)
throws CannotCompileException
{
if (m.getMethodName().equals("move"))
m.replace("{ $1 = 0; $_ = $proceed($$); }");
}
});

Hier habe ich jetzt das Problem, dass ich zusätzlich prüfen muss, ob die Methode "move" zu einer speziellen Klasse oder auch zu einer Ableitung dieser speziellen Klasse gehört. Erst dann darf ich ein replace machen. Die spezielle Klasse ist mir bekannt, somit könnte ich das mit isAssignableFrom(Type type) prüfen. Jedoch benötige ich dafür die Klasse zu der die Methode "move" gehört. Es gibt die Möglichkeit m.getClassName()-> Dies liefert mir aber nur den Namen der Klasse, jedoch bräuchte ich das Objekt damit is es mit isAssignableFrom() prüfen kann. Hat hier jemand eine Idee?
Danke
 
mrBrown

mrBrown

Du kannst doch mit Class.forName die Klasse über den Namen bekommen?
 
mihe7

mihe7

Ich kenn mich mit Javassist nicht aus, aber der API nach sollte auch ein m.getEnclosingClass() funktionieren und dann per getSuperClass() und getDeclaredMethods(String) nach der Superklasse gesucht werden können.
 
D

Daniel87

Danke mrBrown, das war es, was ich gesucht habe. Jedoch hat sich dazu eine weitere Frage ergeben. Mit Hilfe von (m.getMethodName().equals("move") kann ich nun die Methoden move verändern, jeodch muss ich auch die Calls von move über Konstruktoren berücksichten. Hat hier jemand eine Idee?
 
D

Daniel87

Da ich mit m.getMethodName() die direkren aufrufe von move "instrumentieren"kann, muss ich aber auch berücksichtigen, wenn move in einem Konstruktor ausgeführt wird?
 
T

thecain

Wenn du die Methode veränderst die aufgerufen wird, ist das doch vom Constructor aus das selbe?
 
D

Daniel87

Wenn du die Methode veränderst die aufgerufen wird, ist das doch vom Constructor aus das selbe?
Weil ich nicht die Methode "move" verändere, sondern die Methode, welche "move" aufruft. Um es genauer auszuführen, wenn ich den Aufrufe move finde, innerhalb irgendeiner Methode (im Hab ein Array von CtClass, von den Klassen gehe ich alle Methoden durch), dann rufe ich bevor "move" ausgeführt wird eine andere Methode auf. Jetzt muss ich aber auch alle Konstruktoren diese Klassen untersuchen, ob da irgendwo "move" ausgeführt wird.
 
mihe7

mihe7

Wieso rufst Du nicht einfach am Anfang von move die andere Methode auf?
 
Thema: 

javassist API Klasse in MethodCall ermitteln

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben