2016-08-10 3 views
0

Ich habe ein Groovy-Skript, das eine bestimmte Klasse deklariert. Kann ich mit javassist im selben Skript auf diese Klasse zugreifen? Ich muss ein CtClass-Objekt dafür erstellen. HierKann auf eine in Groovy-Skript deklarierte Klasse in javassist zugegriffen werden?

ist ein Beispiel für das Skript, test.groovy:

import javassist.*; 

public class TestClass { 
    public String testMethod(String x) { 
     return x + "."; 
    } 
} 

// I can use TestClass now for ordinary operations 
TestClass obj = new TestClass(); 
println(obj.testMethod("a")); 

ClassPool pool = ClassPool.getDefault(); // ? 
CtClass cc = pool.getCtClass("TestClass"); // this doesn't work 

Die letzte Zeichenfolge einen Fehler verursacht:

Caught: javassist.NotFoundException: TestClass 
javassist.NotFoundException: TestClass 
    at javassist.ClassPool.get(ClassPool.java:450) 
    at javassist.ClassPool.getCtClass(ClassPool.java:515) 
    at javassist.ClassPool$getCtClass$0.call(Unknown Source) 
    at test.run(test.groovy:14) 

Es ist natürlich möglich, diese Klasse außerhalb des Skripts zu bewegen und kompilieren Sie es in eine .class-Datei und dann ist es einfach, es zu laden. Ich denke, es ist auch im Skript möglich, diese Klasse zum Beispiel dynamisch zu einem Byte-Array oder einer .class-Datei zu kompilieren und dann in javassist zu laden. Aber ist es möglich, dies ohne zusätzliche (erneute) Kompilierung dieser Klasse zu tun und die Klasse zu verwenden, auf die ich bereits im normalen Betrieb zugreifen kann?

Antwort

1

Sie können benutzerdefinierte Codequellen für einen Javassist ClassPool registrieren. Standardmäßig ruft Javassist Klassendateien aus dem Klassenpfad auf, wenn Sie ClassPool.getDefault() aufrufen. Sie müssten sich die Klassendateien von Groovy besorgen.

Eine Möglichkeit, dies zu tun, wäre, die Klassendateien von einem Java-Agenten zu lesen, der es ermöglicht, eine Klassendatei unter Verwendung einer ClassFileTransformer zu lesen. Eine andere Möglichkeit wäre, sich in den Groovy-Klassenlader einzuhängen, der das Skript lädt, in dem alle Klassen durch findClass übergeben werden.

Verwandte Themen