Tôi có một chương trình Java tải các tệp lớp của bên thứ ba (các lớp tôi không viết) và thực thi chúng. Các lớp này thường sử dụng java.util.Random
, theo mặc định, tạo ra các giá trị hạt giống bắt đầu ngẫu nhiên mỗi khi nó được khởi tạo. Vì lý do tái tạo, tôi muốn cho các lớp này cùng một hạt giống bắt đầu mỗi lần, thay đổi nó theo quyết định của tôi.Làm thế nào tôi có thể cho java.util.Random một hạt giống cụ thể trong các lớp học của bên thứ ba?
Dưới đây là một số trong những giải pháp rõ ràng, và tại sao họ không làm việc:
Sử dụng một lớp ngẫu nhiên khác nhau trong classfiles thirdparty. Vấn đề ở đây là tôi chỉ tải các tệp lớp và không thể sửa đổi nguồn.
Sử dụng trình nạp lớp tùy chỉnh để tải lớp ngẫu nhiên của riêng chúng tôi thay vì phiên bản của JVM. Cách tiếp cận này sẽ không hoạt động vì Java không cho phép các trình nạp lớp ghi đè lên các lớp trong gói
java
.Hoán đổi bản thực thi
java.util.Random
của rt.jar cho riêng chúng tôi hoặc đưa tệp vào vị trí đáng tin cậy cho JVM. Các phương pháp này yêu cầu người dùng ứng dụng rối tung với cài đặt JVM trên máy của họ và không tốt.Thêm lớp tùy chỉnh
java.util.Random
vào lớp khởi động. Trong khi điều này sẽ làm việc về mặt kỹ thuật, đối với ứng dụng cụ thể này, nó là không thực tế bởi vì ứng dụng này là dành cho người dùng cuối để chạy từ một IDE. Tôi muốn làm cho ứng dụng chạy thuận tiện cho người dùng, có nghĩa là buộc họ phải đặt bootclasspath của họ là một nỗi đau. Tôi không thể giấu điều này trong một kịch bản, vì nó được dự định chạy từ một IDE như Eclipse (để gỡ lỗi dễ dàng.)
Vậy làm cách nào tôi có thể làm điều này?
Cha Nging bootclasspath có hiệu quả, nhưng đòi hỏi phải sửa đổi cách chương trình Java được chạy. Điều này là tốt nếu bạn có thể kiểm soát cách ai đó khởi chạy chương trình, ví dụ: một kịch bản khởi động, nhưng trong trường hợp của tôi, người dùng thường chạy từ bên trong một IDE và sẽ phải thực hiện nó theo cách thủ công, điều đó không tốt. – adum