2012-06-16 23 views
5

Như chúng ta biết, trong Java, tên phương thức không đủ để phân biệt các phương thức khác nhau.Xác định nội bộ của một phương thức Java là gì?

Tôi nghĩ (có thể sai), để phân biệt một phương pháp, nó cần các thông tin sau:

(className, methodName, methodParameters) 

Hơn nữa,

  • làm thế nào để xác định một phương pháp hiệu quả hơn trong nội bộ?
  • Tôi đã nghe nói về "id phương thức". Nó có nghĩa là có một ánh xạ giữa ba trên và một số nguyên, vì vậy JVM chỉ sử dụng id phương pháp sau khi phân tích cú pháp?
  • Nếu có, nó có nằm trong bảng biểu tượng không?

Cảm ơn!

+1

Câu hỏi của bạn quá mơ hồ. Bạn đang nói về việc xác định phương thức trong trình biên dịch? Trong tệp ".class"? Trong chương trình thực thi? –

Trả lời

0

Java luôn phân biệt các thành phần ngôn ngữ của nó theo tên hoàn toàn đủ điều kiện của chúng.

Giả sử bạn có phương thức myMethod(int a, int b) trong lớp MyClass nằm trong gói com.mypackage thì java sẽ xác định phương thức có tên com.mypackage.MyClass.myMethod(int a , int b).

Chỉ cần để cung cấp cho bạn một số cái nhìn sâu sắc hơn, nó cũng mất Loader Lớp xem xét khi có nhu cầu để giải quyết hai yếu tố giống hệt nhau.

Nó xem xét, trong đó lớp bộ nạp được sử dụng để tải các lớp học đặc biệt có chứa các phương pháp mà bạn đang đề cập. Có bốn loại trình nạp lớp trong java. Bạn có thể đọc tài liệu cho lớp học java.lang.Thread cho việc này.

+1

Ý của bạn là gì? "Có bốn loại trình nạp lớp trong java"? –

+0

Một lớp được nạp bởi JVM có thể được nạp bởi bất kỳ bên dưới Bốn bộ tải lớp: 1) lớp Bootstrap loader 2) lớp mở rộng bộ nạp 3) lớp Hệ thống nạp 4) lớp Application loader Xin xem họ có ý nghĩa riêng của họ. Để biết chi tiết, vui lòng xem liên kết bên dưới. http://javapapers.com/core-java/java-class-loader/ – dharam

+0

Ah ok. (4) không bị ràng buộc theo cách của những người khác, và ba người đầu tiên chỉ được phân biệt bởi các quy ước về đặc tính hệ thống để chỉ định đường dẫn tìm kiếm. Điều này phải làm gì với chủ đề hoặc tra cứu phương pháp? Phương thức này dựa trên lớp, do đó phụ thuộc vào trình nạp lớp gián tiếp, nhưng làm thế nào để đề cập đến một phân loại của trình nạp lớp địa chỉ câu hỏi gốc? –

1

Tôi không hiểu rất rõ những gì bạn đang cố gắng làm nhưng tôi nghĩ rằng có một số câu trả lời có thể dù sao:

  • Bạn có thể quan tâm đến các JNI Method Descriptors, một trong những khác nhau string formats sử dụng trong nội bộ bởi JVM (và bởi các thư viện JNI) để xác định các phần tử Java.

  • Rất khó để biết về những gì bạn đang nói về. "Id phương thức" có thể là tham chiếu cho đối tượng java.lang.reflect.Method hoặc có thể là bộ mô tả phương pháp được đề cập bên dưới hoặc bất kỳ thứ gì khác. Bạn đã đọc về nó ở đâu?

  • Tôi nghi ngờ có bảng như vậy bên trong JVM. Ý tôi là, tôi nghi ngờ có một toàn cầu bảng, bởi vì hầu như luôn luôn bạn lấy một phương pháp từ một lớp học, ngay cả khi đối phó với nó bên trong JVM, vì vậy nó là hợp lý để tin rằng phương pháp này được lưu trữ trong lớp.Đó là likewhen chúng tôi sử dụng phản ánh để lấy một phương pháp:

    Class clazz = String.class; 
    Method method = clazz.getDeclaredMethod("charAt", Integer.TYPE); 
    System.out.println(method.getName()); 
    

Lưu ý rằng tôi hỏi lớp String cho phương pháp, thay vì hỏi một số lớp util để cho tôi phương pháp charAt, mà nhận được một int và là từ lớp học String.

Nói cách khác, tuple xác định của bạn là gần như chính xác - nó chỉ không có một lớp:

(methodName, methodParameters) 

và, thay vì lấy phương pháp từ JVM đi qua các lớp và sau đó tên phương pháp và sau đó các kiểu tham số, bạn lấy phương thức trực tiếp từ lớp, tạo cho lớp tên phương thức và các kiểu tham số. Một sự khác biệt tinh tế, chắc chắn, nhưng tôi nghĩ đó là những gì bạn đang thắc mắc.

Điều này hiển nhiên ngay cả trong các mô tả JNI mà tôi đã đề cập bên dưới. Ví dụ, phương pháp

long f(int i, Class c); 

được đại diện bởi các mô tả sau:

"(ILjava/lang/Class;)J" 

Lưu ý rằng không có tham chiếu đến lớp của phương pháp.

excellent documentation on the class file format (đã được chỉ bởi @Lawence) có thể cung cấp cho bạn một số thông tin chi tiết. Tôi khuyên bạn nên đọc nó đầy đủ.

+0

"Tôi nghi ngờ có bảng bên trong JVM." Một JVM có thể định nghĩa một bảng để sử dụng nội bộ, nhưng làm như vậy có thể làm phức tạp việc thu gom rác của các trình nạp lớp. –

0

1) Cách xác định phương thức hiệu quả hơn trong nội bộ?

Bên trong nội dung gì? Có nhiều nơi mà một phương pháp có thể cần phải được "xác định" "nội bộ". Trong trình biên dịch bytecode, trình biên dịch JIT, trình nạp lớp/trình liên kết, biểu diễn lớp, API phản chiếu, trình gỡ rối và vân vân. Họ từng có mối quan tâm hiệu quả khác nhau.

2) Tôi nghe nói về "id phương thức". Nó có nghĩa là có một ánh xạ giữa ba trên và một số nguyên, vì vậy JVM chỉ sử dụng id phương pháp sau khi phân tích cú pháp?

Id phương thức được sử dụng trong biểu diễn lớp và có thể được sử dụng bởi bất kỳ thứ gì dựa trên đó, bao gồm trình tải lớp/trình liên kết, trình biên dịch JIT và trình gỡ lỗi.

JVM không phân tích cú pháp mã Java.

3) Nếu có, nó có nằm trong bảng biểu tượng không?

Nó có thể làm. Nó phụ thuộc vào những gì bạn có nghĩa là "bảng biểu tượng". Ghi nhớ rằng có rất nhiều nơi cần có nhận dạng phương thức, trong suốt vòng đời của một lớp. Ví dụ, các API phản chiếu Java yêu cầu thông tin phương thức để thực hiện các phương thức như getDeclaredMethod(...) và các phương thức khác nhau của Method.

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