2012-09-26 30 views
16

Tôi có thể tải xuống mã nguồn phương thức gốc java ở đâu? Ví dụ, tôi muốn biết mã nguồn của System.arraycopy(), nhưng tôi không thể tìm thấy.Mã nguồn phương pháp gốc Java

+2

phương pháp bản địa và thực hiện khác nhau bởi Virtual Machine bạn đang sử dụng. Không có cách nào thực hiện phương thức này, và trên thực tế mã khác có thể được thực hiện trên các kiến ​​trúc hoặc máy ảo khác nhau. – epsalon

+0

@epsalon Tôi sẽ nghĩ rằng đủ điều kiện như là một câu trả lời cho điều này :) – eis

+0

Open-JDK có thể có mã nguồn này? Tôi rất mong muốn có một cái nhìn của các mã nguồn gốc, tôi nghĩ rằng đây nên là C/C++ mã nguồn, Cảm ơn – Jack

Trả lời

25

Bạn có thể tải xuống mã nguồn OpenJdk here.

Trong thư mục jdk\src\share bạn có thể nhận mã nguồn.

jdk\src\share\native là phương pháp natice souce viết bằng c và C++.

  1. jdk\src\linux nguồn cho Linux.
  2. jdk\src\windows nguồn cho cửa sổ.
  3. jdk\src\solaris souce for solaris.
  4. jd\src\share nguồn chung.

ví dụ: System.arrayCopy();

int tập tin hotspot\src\share\vm\oops\objArrayKlass.cpp dòng 168:

void objArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d, 
          int dst_pos, int length, TRAPS) { 
assert(s->is_objArray(), "must be obj array"); 

if (!d->is_objArray()) { 
    THROW(vmSymbols::java_lang_ArrayStoreException()); 
} 

// Check is all offsets and lengths are non negative 
if (src_pos < 0 || dst_pos < 0 || length < 0) { 
    THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); 
} 
// Check if the ranges are valid 
if ((((unsigned int) length + (unsigned int) src_pos) > (unsigned int) s->length()) 
    || (((unsigned int) length + (unsigned int) dst_pos) > (unsigned int) d->length())) { 
    THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); 
} 

// Special case. Boundary cases must be checked first 
// This allows the following call: copy_array(s, s.length(), d.length(), 0). 
// This is correct, since the position is supposed to be an 'in between point', i.e., s.length(), 
// points to the right of the last element. 
if (length==0) { 
    return; 
} 
if (UseCompressedOops) { 
    narrowOop* const src = objArrayOop(s)->obj_at_addr<narrowOop>(src_pos); 
    narrowOop* const dst = objArrayOop(d)->obj_at_addr<narrowOop>(dst_pos); 
    do_copy<narrowOop>(s, src, d, dst, length, CHECK); 
} else { 
    oop* const src = objArrayOop(s)->obj_at_addr<oop>(src_pos); 
    oop* const dst = objArrayOop(d)->obj_at_addr<oop>(dst_pos); 
    do_copy<oop> (s, src, d, dst, length, CHECK); 
    } 
} 
+0

Tôi không chắc chắn nguồn đó ví dụ System.arraycopy() Sẽ ở đó. Tôi đang xem gói trong 'openjdk \ jdk \ src \ share \ native \ java \ lang \ System.c', và nó chỉ bao gồm tệp tiêu đề' java_lang_System.h' mà không có thông tin, vì vậy bạn chắc chắn nó ở đó? – eis

+0

@eis được cập nhật ở trên. – lichengwu

+0

được thăng hạng để cập nhật, cảm ơn! – eis

0

Phương pháp gốc và được thực hiện khác nhau bởi Máy ảo bạn đang sử dụng. Không có cách nào thực hiện phương thức này, và trên thực tế mã khác có thể được thực hiện trên các kiến ​​trúc hoặc máy ảo khác nhau.

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