次のような Java メソッド シグネチャを返すレポートを解析しています。
method(Ljava/lang/String;[Ljava/lang/String;ZI)V
これを人間が読める形式に戻す最善の方法は何ですか? たとえば、上記は次のようになります。
void method(String, String, boolean, int)
次のような Java メソッド シグネチャを返すレポートを解析しています。
method(Ljava/lang/String;[Ljava/lang/String;ZI)V
これを人間が読める形式に戻す最善の方法は何ですか? たとえば、上記は次のようになります。
void method(String, String, boolean, int)
これを行うコードの例をいくつか示します。
他のすべてが失敗した場合は、これらの場所のいずれかからコードをコピーします。
注意すべき点がいくつかあります。
Scalaの場合:
import scala.util.parsing.combinator.RegexParsers
class JavaSignatureParser extends RegexParsers {
def signature: Parser[String] = methodName ~ "(" ~ parameters ~ ")" ~ result ^^ {
case m ~ "(" ~ p ~ ")" ~ r => r + " " + m + "(" + p + ")"
}
def methodName: Parser[String] = regularName ~ opt(specialName) ^^ {
case m ~ None => m
case c ~ Some(s) => c + s
}
def regularName: Parser[String] = """[A-Z0-9a-z_.$]+""".r
def specialName: Parser[String] = "<" ~> initializer <~ ">" ^^ ("<" + _ + ">")
def initializer: Parser[String] = "init" | "clinit"
def result: Parser[String] = void | nonVoid
def parameters: Parser[String] = rep(nonVoid) ^^ {
case Nil => ""
case p => p.reduceLeft(_ + ", " + _)
}
def nonVoid: Parser[String] = primitive | reference | array
def primitive: Parser[String] = boolean | char | byte | short | int | float | long | double
def void: Parser[String] = "V" ^^ (_ => "void")
def boolean: Parser[String] = "Z" ^^ (_ => "boolean")
def char: Parser[String] = "C" ^^ (_ => "char")
def byte: Parser[String] = "B" ^^ (_ => "byte")
def short: Parser[String] = "S" ^^ (_ => "short")
def int: Parser[String] = "I" ^^ (_ => "int")
def float: Parser[String] = "F" ^^ (_ => "float")
def long: Parser[String] = "J" ^^ (_ => "long")
def double: Parser[String] = "D" ^^ (_ => "double")
def reference: Parser[String] = "L" ~> """[^;]+""".r <~ ";" ^^ { path =>
val JavaName = """^java\..*\.([^.]+)""".r
val fqcn = (path.replaceAll("/", "."))
fqcn match {
case JavaName(simpleName) => simpleName
case qualifiedName => qualifiedName
}
}
def array: Parser[String] = "[" ~> nonVoid ^^ (_ + "[]")
}
独自のものを実装したい場合 (解析機能の練習をするためだけに Scala で行うように)、http ://asm.ow2.org/doc/faq.html#Q7 でマングリングについて説明しています。
欠落している唯一のものは、おそらく次元ごとに 1 つ、'[' (たとえば [Z) で始まるように見える配列です。