如果没有其他人提出可行的答案,我认为编写基于方法签名的代码生成器并不难。
val a = classOf[String].getMethods.map(_.toString).filter(s =>
s.contains("public") && s.contains("static")
)
例如,将提取所有方法签名(String
在本例中)作为字符串。然后
val b = a.map(_.split(" ").reverse.take(2).reverse)
将只获取函数签名,返回类型在前面拆分。现在
val c = b.map(_(1).dropWhile(_ != '(').drop(1).takeWhile(_ != ')').split(","))
val d = b.map(_(1).takeWhile(_ != '('))
将分别获得函数的参数签名和名称。然后我们需要转换原始类型,这很容易,因为我们只需要将第一个字母大写(除了 void 成为单位):
def jprim2scala(s: String) = {
val prim = List("boolean","byte","short","char","int","long","float","double")
def arrayconvert(s: String): String = {
if (s.endsWith("[]")) "Array["+arrayconvert(s.substring(0,s.length-2))+"]"
else if (s=="void") "Unit"
else if (prim contains s) {
s.substring(0,1).toUpperCase + s.substring(1)
}
else s
}
arrayconvert(s)
}
def e = (b,c).zipped.map((bi,ci) => (jprim2scala(bi(0)), ci.map(jprim2scala)))
最后你可以把它们重新组合起来:
val f = (d,e).zipped.map((name,ei) => {
val (ret,args) = ei
val lastname = name.split('.').last
"def "+lastname+"(" +
(for ((a,i) <- args.zipWithIndex) yield ("a"+i+": "+a)).mkString(", ") +
"): "+ret+" = "+name+"("+(0 until args.length).map("a"+_).mkString(",")+")"
})
现在您有一堆 Scala 代码,您可以(手动)将它们放入适当的单例中。
object Stringleton {
// The contents of this is cut-and-paste f.map(" "+_).foreach(println)
def valueOf(a0: java.lang.Object): java.lang.String = java.lang.String.valueOf(a0)
def valueOf(a0: Array[Char]): java.lang.String = java.lang.String.valueOf(a0)
def valueOf(a0: Array[Char], a1: Int, a2: Int): java.lang.String = java.lang.String.valueOf(a0,a1,a2)
def valueOf(a0: Boolean): java.lang.String = java.lang.String.valueOf(a0)
def valueOf(a0: Char): java.lang.String = java.lang.String.valueOf(a0)
def valueOf(a0: Int): java.lang.String = java.lang.String.valueOf(a0)
def valueOf(a0: Long): java.lang.String = java.lang.String.valueOf(a0)
def valueOf(a0: Float): java.lang.String = java.lang.String.valueOf(a0)
def valueOf(a0: Double): java.lang.String = java.lang.String.valueOf(a0)
def copyValueOf(a0: Array[Char], a1: Int, a2: Int): java.lang.String = java.lang.String.copyValueOf(a0,a1,a2)
def copyValueOf(a0: Array[Char]): java.lang.String = java.lang.String.copyValueOf(a0)
def format(a0: java.lang.String, a1: Array[java.lang.Object]): java.lang.String = java.lang.String.format(a0,a1)
def format(a0: java.util.Locale, a1: java.lang.String, a2: Array[java.lang.Object]): java.lang.String = java.lang.String.format(a0,a1,a2)
}
(顺便说一句,可变参数在这里不起作用——如果它们存在,你需要修复它们。你可以通过.isVarArgs
从方法本身(不是它的字符串表示)返回到方法并转换最后一个 Array[X ] 到 X* 中,然后将其称为ai: _*
.)
这种方法的好处是,如果有通用方法,你甚至不需要使用结构类型来提取它们——你可以定义你自己的特征,你的包装方法继承自!(如果你特别有野心,你可以硬塞几乎但不完全符合的方法来实际符合,例如,所有方法都具有相同的方法名称。)