2012-09-26 2 views
16

어디에서 자바 원시 메소드 소스 코드를 다운로드 할 수 있습니까? 예를 들어 System.arraycopy()의 소스 코드를 알고 싶지만 찾을 수 없습니다.자바 원시 메소드 소스 코드

+2

기본 방법과 사용중인 가상 머신에 의해 다르게 구현. 이 방법의 구현은 없으며 사실 다른 아키텍처 나 VM에서 다른 코드가 실행될 수 있습니다. – epsalon

+0

@epsalon 나는 이것에 대한 대답으로 자격이 있다고 생각한다. :) – eis

+0

Open-JDK에이 소스 코드가있을 수 있습니까?이 원시 코드를보고 싶습니다. C/C++이어야한다고 생각합니다. 소스 코드, 감사합니다 – Jack

답변

25

OpenJdk 소스 코드 here을 다운로드 할 수 있습니다.

jdk\src\share 폴더에서 소스 코드를 얻을 수 있습니다.

jdk\src\share\native은 c 및 C++의 소스 코드 작성 방법입니다.

  1. jdk\src\linux Linux 용 소스.
  2. jdk\src\windows windows 용 소스.
  3. jdk\src\solaris souce for solaris.
  4. jd\src\share 일반적인 출처

예 : System.arrayCopy();

INT 파일 hotspot\src\share\vm\oops\objArrayKlass.cpp 라인 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

나는 System.arraycopy 예를 들어 그 소스를 잘 모르겠어요() 거기에있을 것입니다. 나는'openjdk \ jdk \ src \ share \ native \ java \ lang \ System.c'에있는 패키지를보고 있는데, 정보가없는'java_lang_System.h' 헤더 파일을 포함하기 때문에 확실하다. 저기에있어? – eis

+0

@eis 업데이트. 업데이트를 위해 – lichengwu

+0

upvoted, 감사합니다! – eis

0

네이티브 메서드 및 사용중인 가상 컴퓨터에 따라 다르게 구현됩니다. 이 방법의 구현은 없으며 사실 다른 아키텍처 나 VM에서 다른 코드가 실행될 수 있습니다.