2013-06-09 5 views
6

만들기, 객체 생성시 발생하는 단계를 분리 할 수있는 방법이있다 :자바의 unconstructed 객체 인스턴스

  • 메모리 할당
  • 객체 생성

, 거기 바이트 코드 명령어 new (메모리 할당)과 invokespecial (객체 구성)을 정확히 매핑하는 상위 레벨 구조 (아마도 refection을 사용합니까?).

특정 용도는 아니지만 호기심과 같습니다.

답변

3

아니요, JDK에는 이에 대한 API (리플렉션 또는 기타)가 없습니다. 그러나 런타임시 런타임에서이를 수행하는 라이브러리를 사용하여 바이트 코드 자체를 조작 할 수는 있습니다. 예 : http://asm.ow2.org/

+0

심지어 바이트 코드 조작으로도 jlo 생성자가 정상적으로 종료되기 전에 메모리에 액세스 할 수 없습니다. –

0

JVM은 생성자에 개체를 제공하기 전에 개체를 만듭니다. 파생 클래스 생성자가 기본 클래스 생성자에 연결하기 전에 예외를 throw하면 파생 클래스 Finalize 메서드가 실행 된 기본 생성자의 일부없이 개체에서 실행될 것으로 예상됩니다.

+1

음, 기본 클래스 생성자가 파생 클래스 생성자보다 * 먼저 * 실행하지 않습니까? –

+0

@OliCharlesworth : 파생 클래스 생성자는 기본 클래스 생성자에 대한 호출로 시작해야하지만 해당 호출 매개 변수의 평가가 실패 할 수 있습니다 (예 : 파생 생성자가 매개 변수'foo'를 사용하고 기본 생성자를 호출하는 경우) 값이 '1/foo' 인 경우 파생 생성자를'foo' 값으로 0으로 호출하면 기본 생성자가 실행되기 전에 예외가 발생합니다. – supercat

2
 sun.misc.Unsafe 

    /** Allocate an instance but do not run any constructor. 
     Initializes the class if it has not yet been. */ 
    public native Object allocateInstance(Class cls) 
     throws InstantiationException; 

    ---- 

    Field f = Unsafe.class.getDeclaredField("theUnsafe"); 
    f.setAccessible(true); 
    Unsafe unsafe = (Unsafe) f.get(null); 

    Integer integer = (Integer)unsafe.allocateInstance(Integer.class); 

    System.out.println(integer); // prints "0" 

두 번째 파트 인보 크 생성자를 수행하는 방법을 모릅니다.

+0

흥미 롭습니다.이 패키지를 지적 해 주셔서 감사합니다. 나는 기본 ""생성자에서 Class.getDeclaredMethod()를 사용하여 참조를 얻으려고 시도했지만 행운을 빈다. – Nick