È possibile creare una nuova classe nel pacchetto java.lang. Se fosse vietato in che modo gli sviluppatori Oracle sarebbero in grado di sviluppare Java? Sono sicuro che usano lo stesso javac di noi.
Ma non sarà possibile caricarlo, perché java.lang.ClassLoader (che qualsiasi programma di caricamento classe estende) non lo permette, ogni classe di essere caricati passa attraverso questo controllo
...
if ((name != null) && name.startsWith("java.")) {
throw new SecurityException
("Prohibited package name: " + name.substring(0, name.lastIndexOf('.')));
}
...
in modo da finire in qualcosa di simile
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)
Per quanto riguarda le classi che ombra classi esistenti come il tuo java.lang.String
non può essere caricato perché il System Class Loader (quello di default) usa la strategia "genitore prima", quindi le classi java.lang verranno caricate da rt.jar con bootloader. Quindi dovrai sostituire String.class in rt.jar con la tua versione. Oppure sostituirlo con utilizzando l'opzione java -Xbootclasspath/p:
che antepone i percorsi ai percorsi di ricerca del caricatore di classe bootstrap. Così si può
1) copypaste contenuto reale String.java nella vostra String.java
2) cambiare un metodo, ad esempio
public static String valueOf(double d) {
return "Hi";
}
e compilare lo String.java
3) creare una classe di test
public class Test1 {
public static void main(String[] args) throws Exception {
System.out.println(String.valueOf(1.0d));
}
}
4) eseguirlo come
012.351.641,061 mila
java -Xbootclasspath/p:path_to_your_classes Test1
e vedrete
Hi
fonte
2013-01-15 07:14:08
Se la memoria non serve, il pacchetto 'java.lang' è [sigillata] (http://docs.oracle.com/javase/6/docs/technotes/ guide/extensions/spec.html # sealing) quindi non è possibile aggiungere membri ad esso. Sarei sorpreso se la sostituzione del tipo 'String' senza farlo nel vaso di runtime sarebbe successo dato quanto sia fondamentale il tipo per il funzionamento della JVM. – McDowell