2008-12-10 31 views
10

Tôi thấy điều này trong một stack trace:Điều này có nghĩa là gì trong một dấu vết ngăn xếp?

myorg.vignettemodules.customregistration.NewsCategoryVAPDAO.getEmailContentByID (I) Lmyorg/pushemail/mô hình/EmailContent;

Ý nghĩa của "(I)L" là gì?

+0

Mangling tên của Java được ghi lại ở đâu đó trên trang web của Sun. Ai đó nên tra cứu và liên kết với nó từ câu trả lời được chấp nhận. –

+0

Tôi chỉ từng thấy tên mangling này được sử dụng với JNI; Tôi nhận được thông tin của tôi từ http://journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementing/method.html –

Trả lời

15

Nó có nghĩa là phương pháp có một int, và trả myorg.pushemail.model.EmailContent

Chuỗi từ "L" để ";" là một kiểu mô tả, cho kiểu trả về. Nội dung bên trong dấu ngoặc đơn là các tham số của phương thức (trong trường hợp này, chỉ có một).

Các bộ mô tả kiểu này được định nghĩa là một phần của Đặc tả máy ảo Java, trong section 4.3.2. Table 4.3-A hiển thị tất cả các mã được sử dụng. Khi một lớp được biên dịch, các bộ mô tả của biểu mẫu này được sử dụng để xác định chữ ký của các phương thức và các kiểu trường và các biến.

Trong tuần tự hóa Java, các bộ mô tả phương pháp là một phần của thông tin được băm thành form the default serialVersionUID cho lớp học Serializable.

Trong RMI, các trình mô tả phương pháp được băm và kết quả được sử dụng để identify which method is being invoked trong giao diện từ xa.

20

Đó là một hình thức name mangling được sử dụng cho các tình trạng quá tải phương thức. Tên phương thức được nối thêm bởi một chuỗi các ký tự mô tả các tham số và kiểu trả về: các tham số xuất hiện tuần tự bên trong dấu ngoặc đơn và kiểu trả về sau dấu đóng ngoặc. Các mã như sau:

  • Z: boolean
  • B: byte
  • C: char
  • S: short
  • I: int
  • J: long
  • F: float
  • D: double
  • Lđầy đủ trình độ-class-name;: lớp đầy đủ
  • [loại: mảng của loại
  • V: void

Vì vậy, trong trường hợp của bạn, (I)Lmyorg/pushemail/model/EmailContent; có nghĩa là phương pháp lấy một đối số kiểu int và trả về một đối tượng thuộc loại myorg.pushemail.model.EmailContent.

0

Đó là một điểm nhỏ nhưng tôi không nghĩ đây là tên mangling. Tên mangling ngụ ý thêm công cụ bổ sung vào tên. ZBC vv chỉ là cách java mã hóa chữ ký phương thức trong các tệp lớp. Thay vì viết boolean, họ đặt một Z. Nó tiết kiệm không gian.

Theo wikipedia (tiêu chuẩn từ chối áp dụng), tên duy nhất mangling trong java liên quan đến các lớp bên trong và JNI.

+0

Đây phải là nhận xét về câu trả lời của AdamRosenfield, chứ không phải là câu trả lời của chính nó. – heenenee

0

Nó nói, rằng không có phương pháp trong lớp myorg.vignettemodules.customregistration.NewsCategoryVAPDAO gọi getEmailContentByID chấp nhận int luận [ký hiệu bằng (I)] và trả về một đối tượng (bằng L công bố) được gọi là myorg/pushemail/model/EmailContent (đóng bởi ';').

Ký tự L và I được sử dụng để biểu thị một tên lớp và số nguyên trong đặc tả lớp bên trong của Java.

Các vấn đề liên quan