Groovy 本地AST转换可以使用非sdk类吗?

Groovy 本地AST转换可以使用非sdk类吗?,groovy,Groovy,我在类级别应用了一个本地Groovy AST转换。此转换将向目标类添加一个方法 当我试图在转换代码中使用作为构建一部分导入的jar中的类时,我遇到了一个异常“无法解析类”。在下面的示例中,它是org.apache.commons.math3.analysis.function.Abs 当我检查sourceUnit类加载器的URL()时,我只找到了我编译过的源代码的路径,没有看到编译引入的jar列表(其中包括commons math jar) 本地AST转换能否利用编译时拉入的jar中的类?如果是

我在类级别应用了一个本地Groovy AST转换。此转换将向目标类添加一个方法

当我试图在转换代码中使用作为构建一部分导入的jar中的类时,我遇到了一个异常“无法解析类”。在下面的示例中,它是org.apache.commons.math3.analysis.function.Abs

当我检查sourceUnit类加载器的URL()时,我只找到了我编译过的源代码的路径,没有看到编译引入的jar列表(其中包括commons math jar)

本地AST转换能否利用编译时拉入的jar中的类?如果是这样的话,我如何通过转换来解析该类(我尝试显式地添加到sourceUnit类加载器的URL,但没有成功)?如果不是,那么全局AST转换会起作用吗

void visit(ASTNode[] astNodes, SourceUnit sourceUnit) {
    try {
        ClassNode annotatedClass = (ClassNode) astNodes[1]
        MethodNode newMethod = makeMethod(annotatedClass)
        annotatedClass.addMethod(newMethod)
    } catch (Exception e) {
        println 'Failed to apply transform'
        e.printStackTrace()
    }
}

MethodNode makeMethod(ClassNode source) {
    def ast = new AstBuilder().buildFromString(CompilePhase.INSTRUCTION_SELECTION, false, '''
        def added() {
            println new org.apache.commons.math3.analysis.function.Abs().value(-3.0)
            println 'Added'
        }
'''
    )
    return (MethodNode) ast[1].methods.find { it.name == 'added' }
}

完整的示例在构建文件中提供

,乍一看,这看起来像是一个
AstBuilder
限制或bug。AST转换代码应避免单独加载转换或生成代码中使用的类对象(如
类加载器#loadClass
),并且不得将此类类对象附加到AST,因为这可能会导致类加载器与编译器发生冲突(取决于环境)。但这里的情况也不是这样。当我“/gradlew运行”链接项目时,它似乎工作正常。我现在看到链接项目不包含有问题的代码。链接指向特定的分支。切换到添加或导入