gpt4 book ai didi

java - 如何在 Gradle 任务中使用应用程序类路径

转载 作者:行者123 更新时间:2023-12-01 22:14:26 24 4
gpt4 key购买 nike

这个想法相当简单,我想直接访问构建脚本中的项目类。

我第一次尝试:

apply plugin: 'java'

tasks.create(name: 'randomTask', type: SourceTask) {
source.each {
println it
}
}

遗憾的是得到的文件恰好为零。

然后我决定尝试一下compileJava:

apply plugin: 'java'

compileJava {
source.each {
println it
}
}

虽然我确实得到了将要编译的文件列表,但这并不是我真正需要的。我想获取文件的 Class 对象。

例如,如果我有 com.example.SomeClass ,我希望得到 Class<com.example.SomeClass>这样我就可以在这些类上使用反射。

这是我想要的一个不起作用的示例:

apply plugin: 'java'

tasks.create(name: 'randomTask', type: SomeMagicalType) {
UMLBuilder builder = UMLBuilder.builder()
classes.each { clazz ->
clazz.methods.each { method ->
builder.addMethod(method)
}
}
builder.build().writeToFile(file('out/application.uml'))
}

P.S.:我正在使用 Gradle 2.5 和 Java 8

最佳答案

我做了一些尝试,尝试将类放入项目中并实例化它们。这是我设法得到的,它并不漂亮,但它完成了获取 Class 对象的原始工作

task allMethods(dependsOn: classes) << {
def ncl = new GroovyClassLoader()
ncl.addClasspath("${sourceSets.main.output.classesDir}")
configurations.compile.each { ncl.addClasspath(it.path) }
def cTree = fileTree(dir: sourceSets.main.output.classesDir)
def cFiles = cTree.matching {
include '**/*.class'
exclude '**/*$*.class'
}
cFiles.each { f ->
def c = f.path - (sourceSets.main.output.classesDir.path + "/")
def cname = c.replaceAll('/', '\\.') - ".class"
def cz = Class.forName(cname, false, ncl)
cz.methods.each { println it }
}
}

它创建一个新的类加载器,添加默认输出类目录以及来自编译配置的所有依赖类,然后从classesDir构建文件列表,将它们从路径转换为格式为“a.b.YourClass”的字符串,然后加载它并转储类上的方法。

您可以为所需方法中的属性添加自己的逻辑,但这应该可以帮助您继续。

关于java - 如何在 Gradle 任务中使用应用程序类路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31384584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com