我在堆栈跟踪中看到了这一点:
myorg.vignettemodules.customregistration.NewsCategoryVPDAO.getEmailContentByID(I)Lmyorg/pushmail/model/EmailContent;
“ (I)L
”是什么意思?
我在堆栈跟踪中看到了这一点:
myorg.vignettemodules.customregistration.NewsCategoryVPDAO.getEmailContentByID(I)Lmyorg/pushmail/model/EmailContent;
“ (I)L
”是什么意思?
这是一种名称修饰形式,用于消除方法重载的歧义。方法名称附加了一系列描述参数和返回类型的字符:参数在括号内按顺序出现,返回类型在右括号之后。代码如下:
Z
:boolean
B
:byte
C
:char
S
:short
I
:int
J
:long
F
:float
D
:double
L
全限定类名 ;
:全限定类[
type :类型数组V
:void
因此,在您的情况下,这(I)Lmyorg/pushemail/model/EmailContent;
意味着该方法采用一个 type 参数int
并返回一个 type 对象myorg.pushemail.model.EmailContent
。
这意味着该方法需要一个int
, 并返回myorg.pushemail.model.EmailContent
从“L”到“;”的字符串 是一种类型描述符,用于返回类型。括号内的东西是方法参数(在这种情况下,只有一个)。
这些类型描述符被定义为 Java 虚拟机规范的一部分,在4.3.2 节中。表 4.3-A显示了所有使用的代码。当一个类被编译时,这种形式的描述符用于指定方法的签名以及字段和变量的类型。
在 Java 序列化中,方法描述符是经过散列以形成类默认值的信息的一部分serialVersionUID
Serializable
。
在 RMI 中,方法描述符被散列,结果用于识别远程接口中正在调用的方法。
这是一个小问题,但我不认为这是名称修改。名称修饰意味着在名称中添加额外的东西。ZBC 等就是 java 在类文件中编码方法签名的方式。他们没有写布尔值,而是写了一个 Z。这样可以节省空间。
根据维基百科(标准免责声明适用),java 中唯一的名称修饰涉及内部类和 JNI。
myorg.vignettemodules.customregistration.NewsCategoryVAPDAO
它说,在被调用的类中没有方法getEmailContentByID
接受int
参数[由 (I) 表示] 并返回一个被称为myorg/pushemail/model/EmailContent
(由“;”关闭) 的对象(由 L 宣布)。
L 和 I 字符用于表示 Java 内部类规范中的类名和整数。