2011-08-31 3 views
1

다른 사람들이 java에서 문자열 클래스의 인스턴스 주소를 얻는 방법을 설명하고 싶습니다.이 방법을 사용할 수 있습니까? 문제는 해결할 수 없지만 문제를 해결할 방법이 없습니까?어떻게 자바를 사용하여 문자열 클래스의 인스턴스 주소를 얻을 수 있습니까? 이걸 얻을 수있는 방법이 있습니까?

+1

관심이 없으신가요? –

+0

자바가 당신을 위해이 물건을 처리하기 때문에 왜 실제 메모리 주소가 필요한지 잘 모르겠습니다. 정확히 여기서 뭘 하려구? –

답변

0

메모리의 실제 주소를 의미합니까? 그렇다면 no - Java는 메모리를 추상화합니다.

(달성하려는 목표는 무엇입니까? Java에서이 작업을 수행하는 관용적 인 방법이 많으므로 직접 메모리 주소가 필요하지 않아야합니다. 논리적 인 의미에서 문자열은 해당 객체의 "주소"입니다.

0

런타임은 모든 메모리 관리를 수행하므로 Java 언어는 메모리 주소 개념을 지원하지 않습니다.

JNI로 몇 가지 속임수를 쓸 수도 있지만 개체의 주소가 임의로 변경되지 않는다는 보장이 없기 때문에 JNI가 신뢰할 수 있다고 생각하지 않습니다. 쓰레기 수집기 청소.

0

순수한 Java로 개체의 메모리 주소를 가져올 수 없습니다.

가능한 경우에도 신뢰할 수있는 방법으로 사용할 수 없습니다. GC는 언제든지 실행될 수 있으며 포인터를 빈 공간, 다른 객체의 가운데 또는 다른 유형의 객체로 향하게하여 객체를 이동시킬 수 있습니다.


(개념적으로) 불투명 한 JNI 유형에 대한 내부 지식이있는 경우 주소를 추출 할 수 있어야합니다. 그리고 나는 또한 이것을 할 수있는 sun.java.Unsafe 클래스가 있다고 믿습니다 ... 클래스 로더를 사용하기 위해서는 그것을 조율해야하지만.

+0

.. 문자열 클래스의 인스턴스의 논리 주소를 어떻게 얻을 수 있습니까 아니면 반사를 사용하여 안전하지 않은 것을 사용할 수 있습니다. ;) –

2

Farmer가 게시 한 링크에서 적절하게 명명 된 Unsafe 클래스를 사용하여 하나의 기술을 제공하지만 실제로는 일반적으로 객체의 주소를 신뢰할 수있는 것으로 받아 들일 수 있을지 의심 스럽습니다.

또한 API Javadoc에서 설명한대로 System.identityHashCode을 사용하면 지정된 객체의 클래스가 hashCode()를 재정의하는지 여부와 상관없이 기본 메소드 hashCode()가 반환하는 것과 동일한 지정된 해시 코드를 가져올 수 있습니다. . 이것은 "일반적으로 객체의 내부 주소를 정수로 변환하여 구현되지만이 구현 기술은 Java (TM) 프로그래밍 언어에서 필요하지 않습니다."

+0

+1'System.identityHashCode'에 +1 –

1

JNI를 사용하거나 안전하지 않은 클래스를 사용하여 절대 주소를 얻을 수 있습니다.

그러나 둘 모두 쓸데없는 주소이기 때문에 모두 나쁜 아이디어입니다. 멀티 스레드 GC는 언제든지 객체를 이동할 수 있습니다. 즉, 귀하가 얻는 즉시 무효화 될 수 있습니다.

주소를 복사/변경할 수는 있지만 추적 할 수없는 방식으로 임의의 지점에서 JVM이 충돌하는 좋은 방법입니다. 즉 GC는 그것을보고 JVM은 임의의 시점에 죽습니다.

+0

나는 "주소가 쓸모가 없다는 이유로 두 가지 모두 나쁜 아이디어이다."멀티 스레드 GC는 언제든지 객체를 이동할 수 있습니다. 즉, 이 될 수 있습니다. 유효하면 즉시 유효합니다. " – emory

+0

@emory, 고맙습니다. 고쳐 주셨습니다. –

관련 문제