2010-08-11 22 views
9

tôi đã thêm một trường để Object lớp, như trong:Thêm một trường để java.lang.Object

class Object { 
    ... 

    private Object _objInfo; 
} 

tôi đã thay đổi java.lang.Object 's mã nguồn và biên dịch lại OpenJDK 6. Tôi có được ngoại lệ sau khi VM khởi động:

Error occurred during initialization of VM 
    java.lang.IllegalStateException 
    at java.lang.Throwable.initCause(Throwable.java:337) 
    at java.lang.ExceptionInInitializerError.<init>(ExceptionInInitializerError.java:79) 

vấn đề tương tự xảy ra khi tôi định nghĩa lớp đối tượng của riêng tôi và thêm vào phía trước nó để bootclasspath, như trong:

java -Xbootclasspath/p:<path to my Object class> 

Cảm ơn, Horatiu

+0

Tại sao bạn không tạo một classe để đặt _objInfo? –

+2

Tôi không nghĩ bạn thực sự đặt câu hỏi ở bất cứ đâu. –

+4

@justin, nó là khá rõ ràng những gì ông muốn chúng tôi giúp anh ta với ... – jjnguy

Trả lời

4

Xảy ra lỗi lầm trong quá trình khởi của VM java.lang.IllegalStateException tại java.lang.Throwable.initCause (Throwable.java:337) tại java.lang.ExceptionInInitializerError. (ExceptionInInitializerError.java:79)

java.lang.IllegalStateException được ném nếu initCause() được gọi nhiều lần. Có vẻ như việc sửa đổi Object của bạn gây ra một ngoại lệ và khi JVM cố gắng tạo ra một đối tượng Exception (là một lớp con của Object) nó được đưa vào vòng lặp đệ quy và cố gắng gọi initCause() nhiều hơn một lần trên cùng một đối tượng Exception.

Tại sao bạn muốn sửa đổi định nghĩa đối tượng?

+1

Tôi phải giữ một số thông tin tại thời gian chạy cho mỗi đối tượng được sử dụng như một khóa. Đối với điều đó, tôi có một bản đồ băm toàn cục ánh xạ một id obj được trả về bởi System.identityHashCode() cho một số thông tin liên quan đến khóa. Nhưng tra cứu này là tốn kém; nó sẽ nhanh hơn nhiều nếu tôi có một trường trong lớp Object có thể trỏ đến thông tin tùy ý về đối tượng. –

+0

@HoratiuJula đây chính xác là những gì tôi cần cho Profiler Algorithmic của tôi, ngoại trừ việc tôi cần theo dõi các đối tượng được định dạng _all_. Cũng giống như bạn, tôi bắt đầu với một bản đồ được chỉ mục bởi 'System.identityHashCode()' chỉ để tìm thấy nó quá chậm ... – vektor

1

Tôi nghi ngờ rằng có điều gì đó bên trong việc triển khai JVM giả định kích thước của đối tượng. Bạn đã làm cho nó lớn hơn để mã không thành công.

Vì đây là lỗi mà người triển khai JVM không bao giờ xem xét, lỗi xử lý lỗi.

Câu trả lời: bạn không thể sửa đổi đối tượng mà không làm nhiều công việc hơn.

3

Rõ ràng, vẫn còn một số vị trí trong mã gốc, nơi bù trừ trường được hardwired. Sửa đổi một số lớp học, chẳng hạn như Thread, làm hỏng điều này. Nếu bạn thay đổi Object, bạn sẽ làm hỏng tất cả.

+0

Tôi biết, trong máy ảo Dalvik (được sử dụng trong Android) Tôi có cùng một vấn đề ... Nhưng ở đó, tôi đã tìm thấy sự bù đắp và tính lại chúng. Tuy nhiên, tôi không biết nơi bù đắp trường cho đối tượng, chuỗi, vv, được hardcoded trong openjdk ... –

+1

@Horatiu Jula: có vẻ như câu hỏi bạn thực sự muốn trả lời là ... "Tôi cần thay đổi gì thế nào để tạo ra các nguồn JVM openjdk 6 nếu tôi mở rộng dấu chân bộ nhớ của lớp Object? " Tôi sẽ cảnh báo bạn rằng VM openjdk có thể là nạn nhân của một số tối ưu hóa hiệu năng rất mạnh sẽ làm cho những thay đổi mà bạn cần phải thực hiện để hỗ trợ những thay đổi mong muốn của bạn đối với Object obtuse và phổ biến rộng rãi. – vkraemer

+0

@Horatiu Jula: bạn có thể cần phải tạo các bản mod cho javac. – vkraemer

9

Không sửa đổi Object. Không sửa đổi bất cứ điều gì trong java.lang. Tôi không biết nếu nó là kỹ thuật có thể, nhưng nó chắc chắn là một ý tưởng đặc biệt xấu, và về cơ bản phá vỡ nền tảng Java ("Q: Hợp đồng của Object.equals() là gì? A: Nó phụ thuộc vào những sửa đổi tùy chỉnh cho JVM làm cho nó làm ... ") - bạn sẽ không thể làm được gì.

Hãy suy nghĩ về những gì bạn đang làm - bạn đang thêm lớp này (và hành vi có thể) vào mọi đối tượng. ClassLoaders, Strings, Threads, InputStreams, Throwables, XMLGregorianCalendar, mọi thứ. Điều này gần như chắc chắn không phải là những gì bạn dự định. Thay vào đó, một cách tiếp cận khác là thêm các sửa đổi của bạn vào một lớp trừu tượng AppnameSuperObject và mở rộng lớp này cho các lớp mà bạn thực sự là muốn thêm hành vi này vào.


Mặt khác, nếu bạn thực sự muốn làm điều này cho tất cả các đối tượng cho một số loại khai thác gỗ/hồ sơ/etc loại công việc, nhìn vào sử dụng aspect-oriented programming để weave the extra fields onto the classes at runtime.

+0

Tôi đã thử nó, không hoạt động đối với lớp Object ... –

+2

Hoặc thay vì giảng dạy, bạn có thể thử trả lời câu hỏi của OP. Có ý tưởng căn bản này là nếu bạn không biết câu trả lời, bạn không nên đăng câu trả lời. Thay vào đó, hãy xem xét yêu cầu làm rõ câu hỏi trong nhận xét. –

+1

Như Ted Neward đã được mô tả trở lại vào năm 2001, bootclasspath tồn tại, một phần, vì lý do chính xác này: để có thể sửa đổi các lớp java. * (Http://www.tedneward.com/files/Papers/BootClasspath/BootClasspath. pdf) – Confusion

0

Bạn nên tạo lớp X với trường này mà bạn muốn đặt trong đối tượng và tạo lớp của bạn kế thừa từ X.

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