3

次のような Java メソッド シグネチャを返すレポートを解析しています。

method(Ljava/lang/String;[Ljava/lang/String;ZI)V

これを人間が読める形式に戻す最善の方法は何ですか? たとえば、上記は次のようになります。

void method(String, String, boolean, int)
4

3 に答える 3

3

これを行うコードの例をいくつか示します。

他のすべてが失敗した場合は、これらの場所のいずれかからコードをコピーします。

注意すべき点がいくつかあります。

  • シグニチャの意味のある変数名を回復することはできません(明らかに...)
  • メソッドが汎用の場合、これは署名に示されません。シグニチャ情報は、raw(消去済み)メソッドタイプ用です。
于 2012-09-08T02:56:51.433 に答える
1

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] = "&lt;" ~> initializer <~ "&gt;" ^^ ("<" + _ + ">")
  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 ^^ (_ + "[]")
}
于 2012-09-11T18:00:30.447 に答える
1

独自のものを実装したい場合 (解析機能の練習をするためだけに Scala で行うように)、http ://asm.ow2.org/doc/faq.html#Q7 でマングリングについて説明しています。

  • プリミティブ表現:
    • 'V' - ボイド
    • 'Z' - ブール値
    • 'C' - 文字
    • 'B' - バイト
    • 'S' - ショート
    • 「私」 - 整数
    • 'F' - フロート
    • 'J' - ロング
    • 'D' - ダブル
  • クラス表現:
    • Lクラス;
    • Ljava/io/ObjectOutput;
    • Ljava/言語/文字列;

欠落している唯一のものは、おそらく次元ごとに 1 つ、'[' (たとえば [Z) で始まるように見える配列です。

于 2012-09-09T15:15:11.590 に答える