我有一个游戏的多项目设置.有一个非常具体的子项目叫做"资源",只包含要打包到jar中的图像,声音和texfiles等文件.
我有一个自定义任务来处理图像并打包它们.在'src/main'里面,我正在使用一个文件夹'preprocess',其中图像应该去,而'unmanaged'文件夹,其他一切都在这里.通过运行我的任务,'preprocess'中的所有图像都被打包并输出到'resources','unmanaged'中的所有图像都按原样复制.
val texturePacker = TaskKey[Unit]("texture-packer", "Runs libgdx's Texture Packer")
val texturePackerTask = texturePacker := {
println("Packaging textures...")
val inputDir = file("resources/src/main/preprocess")
val outputDir = file("resources/src/main/resources")
val folders = inputDir.asFile.listFiles filter (_.isDirectory)
println("Sub-Folders:" + folders.mkString(", "))
// Run Texture Packer
for (subfolder <- folders) {
println("Building assets for:" + subfolder)
val args = Array(subfolder.toString, outputDir.toString, subfolder.getName)
com.badlogic.gdx.tools.imagepacker.TexturePacker2.main(args)
}
// Copy unmanaged resources
IO.copyDirectory(file("resources/src/main/unmanaged"), file("resources/src/main/resources"))
}
Run Code Online (Sandbox Code Playgroud)
然后在'资源'项目的设置内:
...
packageBin in Compile <<= packageBin in Compile dependsOn(texturePacker)
...
Run Code Online (Sandbox Code Playgroud)
其他子项目依赖于与其运行相关联的packageBin.这样,每当我运行项目时,我都会获得最新的资源状态.我不希望它是按需的.问题是每次运行需要很长时间才能处理.我知道SBT支持缓存SBT常见问题,但我不明白如何使其适应我的任务.
如果未修改文件夹列表中子文件夹中的文件,如何使我的自定义任务避免重做工作?
我有一个专门的字段的类,并使用原始数据类型.例如Tuple2 [Int,String]:
scala> class TupleReflection(val tuple: Tuple2[Int, String])
defined class TupleReflection
scala> val refl = new TupleReflection((5, "hello"))
refl: TupleReflection = TupleReflection@1a597ec8
Run Code Online (Sandbox Code Playgroud)
我想现在使用反射来找出我的'refl'实例中的Tuple2的类型参数.(我用'头'来骗取场地,因为我知道这是唯一一个.)
scala> val field = refl.getClass.getDeclaredFields.head
field: java.lang.reflect.Field = private final scala.Tuple2 TupleReflection.tuple
Run Code Online (Sandbox Code Playgroud)
现在我有了该字段,我可以查询泛型类型.
scala> field.getGenericType
res41: java.lang.reflect.Type = scala.Tuple2<java.lang.Object, java.lang.String>
Run Code Online (Sandbox Code Playgroud)
现在的问题是第一种类型是Object.有没有办法通过单独的反射知道该参数的实际类型(Int)?
我在自己的API中使用自动序列化的上下文中使用它.给定一个标有@Serializable的类,我可以序列化它.为此,我必须使用反射递归地构建类的字段和类型的树,以便我可以进行深度序列化.
如果我直接使用@Specialized类,它可以工作,因为类型是显式的,并且在编译时在调用站点处是已知的.如果层次结构中的字段是@specialized,我无法通过反射来判断.查询类中声明的字段或方法不会产生正确的值.类型存在于运行时,但仅存在于字段中保存的实例上,而不是字段本身的声明上.因此,如果实例为null并且不能执行"getClass",我无法仅通过反射知道正确的类型.