2012-09-06 2 views
3

을 우회하는 것은 :
는 1) 안전하지 않은, 내가 더 이상 보장이 없다는 입력 안전하고 JVM 그러므로
이 충돌 할 수 있음) ByteBuffers 또는 JNI을 사용하여 유사한 작업을 수행 할 수 있음
3) Unsafe는 내부 클래스이므로 잘 사라질 수 있습니다.추출 데이터 (내가 뭐하는 거지 것을 충분히 알고 보안 Manager0

나는 이것을 실험 목적으로 만하고 있으며 그 결과를 알고 있습니다. 염두에두고

, 나는 배열로부터 데이터 사용하여 추출하기 위해 노력하고 안전하지 않은 반사 :

내가 먼저 배열의 오프셋 (offset) 분야 찾습니다

public long findFieldOffset(Event event) { 
    try { 
     Class cl = event.getClass();    
     Field data_field = cl.getDeclaredField("data");    
     data_field.setAccessible(true); 
     long offset = unsafe.objectFieldOffset(data_field);    
     return offset;    
    } catch (NoSuchFieldException e) { 
     e.printStackTrace(); 
    } 
    return 0;   
} 

가 나는 또한 기본을 추출을 배열의 위치 :

 int base = unsafe.arrayBaseOffset(byte[].class); 

내가 나중에 클래스 이벤트의 배열을 추출하려고하고,이 버퍼 (byte_offset에 복사는의 결과입니다). 아래의 코드에서
은, 첫 번째 부분은 테스트 함수이고 올바른 문자열을 출력, 두 번째 부분 배열을해야 무엇을 추출하는 동안,하지만 테스트는 쓰레기 유니 코드 값을 반환 할 때 :

    /* Testing */ 
        active_buffer.getBuffer().position(1); 
        active_buffer.getBuffer().put(event.getData()); 
        active_buffer.getBuffer().position(1); 
        active_buffer.getBuffer().get(tuple, 0, (int)tuple_size); 
        System.out.println("Test1: " + new String(tuple)) ; 
        /* Test1 prints out the correct string */ 

        unsafe.copyMemory((Object) event, byte_offset + base, (Object) null, active_buffer.getAddress() + 1, tuple_size); 
        active_buffer.getBuffer().position(1); 
        active_buffer.getBuffer().get(tuple, 0, (int)tuple_size); 
        System.out.println("Test2: " + new String(tuple)); 
        /* Garbage unicode values gets printed*/ 

사람을 수 이 코드에 잘못된 것이 있습니까? data으로

+0

HotSpot은 JNI를 사용하는 대신 많은 안전하지 않은 "원시"호출을 내장 함수로 변환합니다. 예 : 이것은 하나의 기계어 명령 일 수 있습니다. –

답변

1

은 어느 경우에 당신이 어딘가에 그것을 복사 할 수 있으며, 바이트 [] 당신이로이 취급 할 필요가있는 byte[]

data 경우로 취급, 원시 또는 참조 중 하나이며, 필드입니다 진정한 목적이 아닌 사건.

+0

감사. 좋은 지적. 나는 지금 Test1을 얻는다 : name10000000000Bob000000000000YxzBUSPv Test2 : ?? dname10000000000Bob0000000000YxzBUSPv 그래서 그것은 좋은 출발이다. 배열의 메모리 위치에 직접 접근하는 방법에 대해 알고 싶습니다. (그냥 event.getData()를 사용하여 작업을 제안했지만 event.getData()는 상당히 비싼 호출이므로 – user1018513

+0

'data' 필드를 리플렉션을 통해 액세스 할 수있게하려면 Unsafe를 사용할 필요가 없습니다. Unsafe를 사용하려면 참조에 액세스 할 수 있으므로 byte []의 내용을 복사 할 필요가 없습니다. 'byte []'의 내용을 복사하려면 다른 'byte []'처럼 System.arrayCopy()를 사용할 수 있습니다. –

+0

직접/네이티브 메모리에서 데이터를 복사하는 데 안전하지 않으면 안됩니다. 필요없는 것처럼 보입니다. –