Ngoài constructor thì còn có cách nào để khởi tạo đối tượng hay không?

Mình đang học đến phần constructor java và đang mắc ở câu hỏi " ngoài constructor thì còn có cách nào để khởi tạo đối tượng hay không". Mong mọi người có thể giải đáp giúp mình, mình cảm ơn.

Có chứ cậu!
Cậu có thể dùng:

  • objenesis: thư viện thao tác trên bytecode để tạo object.
  • Deserializing để bypass constructor.

Câu trả lời trên được ăn cắp một cách trắng trợn ở đây :wink:

5 Likes

Vậy reflection không phải là cách tạo object mà không cần constructor ạ?

âu kê bạn mình cảm ơn bạn rất nhiều :100:

Nó gọi đến hàm dựng của lớp thôi.

1 Like

Nếu vậy thì không có từ khóa new, mà không có từ khóa new thì trong RAM (heap) không có object, thế thì object lưu ở đâu? Vậy nó lấy object ở đâu ra để inject vào object khác trong dependency injection pattern ạ? (Spring boot cũng dùng pattern singleton với dependency injection và các object (bean) cũng được tạo ra mà không có từ khóa new). Constructor là method chạy cuối cùng sau khi tạo đối tượng thành công.

như cái cmt này

  • objenesis: thư viện thao tác trên bytecode để tạo object.
  • Deserializing để bypass constructor.

thì họ can thiệp trực tiếp vào mã bytecode luôn, nên ko cần từ khóa new vẫn tạo đc object, nếu mình suy nghĩ ko sai, thì khi đã can thiệp vào đến tận bytecode thì bạn ko còn phụ thuộc vào cái cú pháp phía trên của ngôn ngữ nữa rồi, lúc này bạn kiểu như toàn quyền chỉnh sửa code trực tiếp, mình nói điều này vì bên c/c++ nó cũng dùng kĩ thuật gần như tương tự khi hack vào 1 program, đó là nó sài ollydbg dịch ngược file thực thi .exe rồi sửa trực tiếp trên mã máy luôn, lúc này chả quan tâm hàm này hàm kia của c nữa, chỉ toàn là mã máy sửa thoải mái, quan trọng là biết cách sửa hay ko thôi =))

5 Likes

Ohm, cậu cần phải có public constructor thì mới khởi tạo object dùng reflection được. Ultimately, reflection vẫn gọi tới constructor.

Nếu vậy thì không có từ khóa new, mà không có từ khóa new thì trong RAM (heap) không có object, thế thì object lưu ở đâu?

Uhm, không có từ khóa “new” không có nghĩa là object không thể được tạo ra ở heap cậu à :smile:
Và, Object thì luôn tồn tại ở heap memory :smile:

Vậy nó lấy object ở đâu ra để inject vào object khác trong dependency injection pattern ạ?

Cậu biết rồi đó :smile:

Spring boot cũng dùng pattern singleton với dependency injection và các object (bean) cũng được tạo ra mà không có từ khóa new

Spring tạo object sử dụng reflection. Nó không cần dùng new, điều đó là đúng. Cơ mà bean cậu cần tạo vẫn cần có ít nhất 1 public constructor, vì reflection cần nó :smile:

Hope it helps!

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?