2013-06-09 40 views
6

Trong Java, có cách nào để tách các bước điều đó xảy ra trong quá trình tạo đối tượng:Tạo một thể hiện đối tượng unconstructed

  • cấp phát bộ nhớ
  • xây dựng đối tượng

Nói cách khác, đang có các cấu trúc mức cao (có thể sử dụng refection?) để ánh xạ chính xác các hướng dẫn bytecode new (cấp phát bộ nhớ) và invokespecial (xây dựng đối tượng).

Không sử dụng cụ thể, giống như một điều tò mò.

Trả lời

3

Không, không có API (phản ánh hoặc cách khác) cho điều này trong JDK. Tuy nhiên, bạn có thể thao tác mã byte, khi chạy, sử dụng các thư viện làm điều đó. Ví dụ: http://asm.ow2.org/

+0

ngay cả với thao tác bytecode, bạn sẽ không có quyền truy cập vào bộ nhớ trước khi hàm tạo jlo đã thoát bình thường. –

0

JVM tạo đối tượng trước khi chúng được gán cho hàm tạo; nếu một hàm tạo lớp dẫn xuất ném ra một ngoại lệ trước khi kết nối với hàm tạo lớp cơ sở, tôi sẽ mong rằng phương thức lớp bắt nguồn Finalize sẽ chạy trên đối tượng mà không có bất kỳ phần nào của hàm tạo cơ sở bao giờ chạy.

+1

Umm, không phải hàm tạo lớp cơ sở thi hành * trước * constructor lớp dẫn xuất? –

+0

@OliCharlesworth: Hàm tạo lớp dẫn xuất phải bắt đầu với lời gọi hàm tạo cơ sở, nhưng có thể đánh giá tham số của cuộc gọi đó thành không thành công (ví dụ: nếu hàm tạo có tham số 'foo' và gọi hàm tạo cơ sở với giá trị '1/foo', gọi hàm tạo có nguồn gốc với giá trị' foo' bằng 0 sẽ ném một ngoại lệ trước khi hàm tạo cơ sở thực thi). – 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" 

không biết cách thực hiện phần thứ hai - gọi hàm tạo trên đó.

+0

Thú vị, cảm ơn bạn đã chỉ ra gói này. Tôi đã cố gắng nhận được một tài liệu tham khảo về mặc định "" constructor bằng cách sử dụng Class.getDeclaredMethod(), nhưng không may mắn như vậy. – Nick

Các vấn đề liên quan