만들기, 객체 생성시 발생하는 단계를 분리 할 수있는 방법이있다 :자바의 unconstructed 객체 인스턴스
- 메모리 할당
- 객체 생성 즉
, 거기 바이트 코드 명령어 new
(메모리 할당)과 invokespecial
(객체 구성)을 정확히 매핑하는 상위 레벨 구조 (아마도 refection을 사용합니까?).
특정 용도는 아니지만 호기심과 같습니다.
만들기, 객체 생성시 발생하는 단계를 분리 할 수있는 방법이있다 :자바의 unconstructed 객체 인스턴스
, 거기 바이트 코드 명령어 new
(메모리 할당)과 invokespecial
(객체 구성)을 정확히 매핑하는 상위 레벨 구조 (아마도 refection을 사용합니까?).
특정 용도는 아니지만 호기심과 같습니다.
아니요, JDK에는 이에 대한 API (리플렉션 또는 기타)가 없습니다. 그러나 런타임시 런타임에서이를 수행하는 라이브러리를 사용하여 바이트 코드 자체를 조작 할 수는 있습니다. 예 : http://asm.ow2.org/
JVM은 생성자에 개체를 제공하기 전에 개체를 만듭니다. 파생 클래스 생성자가 기본 클래스 생성자에 연결하기 전에 예외를 throw하면 파생 클래스 Finalize
메서드가 실행 된 기본 생성자의 일부없이 개체에서 실행될 것으로 예상됩니다.
음, 기본 클래스 생성자가 파생 클래스 생성자보다 * 먼저 * 실행하지 않습니까? –
@OliCharlesworth : 파생 클래스 생성자는 기본 클래스 생성자에 대한 호출로 시작해야하지만 해당 호출 매개 변수의 평가가 실패 할 수 있습니다 (예 : 파생 생성자가 매개 변수'foo'를 사용하고 기본 생성자를 호출하는 경우) 값이 '1/foo' 인 경우 파생 생성자를'foo' 값으로 0으로 호출하면 기본 생성자가 실행되기 전에 예외가 발생합니다. – supercat
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"
두 번째 파트 인보 크 생성자를 수행하는 방법을 모릅니다.
흥미 롭습니다.이 패키지를 지적 해 주셔서 감사합니다. 나는 기본 "
심지어 바이트 코드 조작으로도 jlo 생성자가 정상적으로 종료되기 전에 메모리에 액세스 할 수 없습니다. –