在堆栈跟踪中,这意味着什么?

11

在堆栈跟踪中看到以下内容:

myorg.vignettemodules.customregistration.NewsCategoryVAPDAO.getEmailContentByID(I)Lmyorg/pushemail/model/EmailContent;

(I)L”是什么意思?


Java的名称混淆在Sun的网站上有记录。有人应该查找并从被接受的答案中链接到它。 - Paul Tomblin
我只在JNI中见过这种名称混淆的使用;我从http://journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementing/method.html获取了我的信息。 - Adam Rosenfield
4个回答

20
这是一种用于消除方法重载歧义的名称混淆形式。 方法名后面附加一系列字符来描述参数和返回类型:参数按顺序出现在括号内,而返回类型则跟在右括号后面。 代码如下:
  • Z: boolean
  • B: byte
  • C: char
  • S: short
  • I: int
  • J: long
  • F: float
  • D: double
  • Lfully-qualified-class-name ; : 完全限定类
  • [ type : type数组
  • V: void
所以,在您的情况下,(I)Lmyorg/pushemail/model/EmailContent;表示该方法接受一个类型为int的参数,并返回一个类型为myorg.pushemail.model.EmailContent的对象。

16

这意味着该方法接受一个 int 参数,并返回 myorg.pushemail.model.EmailContent

"L" 到 ";" 的字符串是返回类型的一种描述符。括号里面的内容是方法参数(在这个例子中只有一个)。

这些类型描述符是 Java 虚拟机规范的一部分,位于第4.3.2节表4.3-A 显示了所有使用的代码。当类被编译时,采用这种形式的描述符来指定方法的签名以及字段和变量的类型。

在 Java 序列化中,方法描述符是要哈希的信息的一部分,用于形成可序列化类的默认 serialVersionUID

在 RMI 中,方法描述符被哈希,结果被用来标识在远程接口中正在被调用的方法


0

它说,在类myorg.vignettemodules.customregistration.NewsCategoryVAPDAO中没有名为getEmailContentByID的方法,该方法接受int参数(用(I)表示),并返回一个名为myorg/pushemail/model/EmailContent的对象(用L表示)(以';'结尾)。

L和I字符用于表示Java内部类规范中的类名和整数。


0

这只是一个小问题,但我不认为这是名称混淆。名称混淆意味着向名称添加额外的内容。 ZBC 等只是 Java 在类文件中编码方法签名的方式。他们把 boolean 写成 Z,这样可以节省空间。

根据维基百科(标准免责声明适用),Java 中唯一涉及名称混淆的是内部类和 JNI。


这应该是对AdamRosenfield的回答的评论,而不是单独的回答。 - heenenee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接