Можно ли получить доступ к классу, объявленному в скрипте Groovy, в javassist?

У меня есть сценарий Groovy, который объявляет определенный класс. Могу ли я получить доступ к этому классу в том же скрипте через javassist? Мне нужно создать для него объект CtClass.

Вот пример скрипта 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

Последняя строка вызывает ошибку:

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)

Конечно, можно переместить этот класс за пределы скрипта и скомпилировать его в файл .class, после чего его легко загрузить. Я думаю, что в скрипте также возможно, скажем, снова динамически скомпилировать этот класс в массив байтов или в файл .class, а затем загрузить его в javassist. Но можно ли это сделать без дополнительной (пере)компиляции этого класса и использовать класс, к которому я уже имею доступ в обычных операциях?


person user444214    schedule 10.08.2016    source источник


Ответы (1)


Вы можете зарегистрировать собственные источники кода в Javassist ClassPool. По умолчанию Javassist читает файлы классов из пути к классам, если вы вызываете ClassPool.getDefault(). Вам нужно будет получить файлы классов из Groovy.

Одним из способов сделать это было бы чтение файлов класса из агента Java, который позволяет читать файл класса с помощью ClassFileTransformer. Другой способ — подключиться к загрузчику классов Groovy, который загружает сценарий, в котором все классы передаются через findClass.

person Rafael Winterhalter    schedule 10.08.2016