Bạn có thể tạo một lớp mới trong gói java.lang. Nếu nó bị cấm như thế nào các nhà phát triển Oracle sẽ có thể phát triển Java ở tất cả? Tôi chắc chắn họ sử dụng cùng một javac như chúng tôi.
Nhưng bạn sẽ không thể tải nó, vì java.lang.ClassLoader (mà bất kỳ classloader kéo dài) không cho phép điều đó, mỗi lớp được nạp trải qua việc kiểm tra này
...
if ((name != null) && name.startsWith("java.")) {
throw new SecurityException
("Prohibited package name: " + name.substring(0, name.lastIndexOf('.')));
}
...
do đó bạn sẽ kết thúc trong một cái gì đó giống như
Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.lang
at java.lang.ClassLoader.preDefineClass(ClassLoader.java:649)
at java.lang.ClassLoader.defineClass(ClassLoader.java:785)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at Test1.main(Test1.java:11)
Đối với các lớp học bóng lớp hiện như java.lang.String
của bạn không thể tải được vì Trình nạp Lớp Hệ thống (mặc định) sử dụng chiến lược "cha mẹ đầu tiên", vì vậy các lớp java.lang sẽ được tải từ rt.jar với trình nạp lớp bootstrap. Vì vậy, bạn sẽ cần phải thay thế String.class trong rt.jar bằng phiên bản của bạn. Hoặc ghi đè lên số sử dụng tùy chọn java -Xbootclasspath/p:
để thêm đường dẫn vào đường dẫn tìm kiếm trình tải lớp khởi động. Vì vậy, bạn có thể
1) copypaste thực nội dung String.java vào String.java bạn
2) thay đổi một phương pháp, ví dụ như
public static String valueOf(double d) {
return "Hi";
}
và biên dịch String.java bạn
3) tạo một lớp thử nghiệm
public class Test1 {
public static void main(String[] args) throws Exception {
System.out.println(String.valueOf(1.0d));
}
}
4) chạy nó dưới dạng
java -Xbootclasspath/p:path_to_your_classes Test1
và bạn sẽ thấy
Hi
Nguồn
2013-01-15 07:14:08
Nếu bộ nhớ phục vụ, 'cái gói java.lang' được [kín] (http://docs.oracle.com/javase/6/docs/technotes/ hướng dẫn/mở rộng/spec.html # niêm phong) để bạn không thể thêm thành viên vào nó. Tôi sẽ ngạc nhiên nếu thay thế kiểu 'String' mà không thực hiện nó trong jar thời gian chạy sẽ thành công với kiểu cơ bản của kiểu là hoạt động của JVM. – McDowell