Come lo spoofing di un pacchetto di java (e quindi una parte del API) in OSGi?
Domanda
E 'possibile falsificare una parte delle API Java standard, esportando il proprio bundle che sostituisce questa API? Naturalmente con le stesse interfacce.
Sarebbe quindi possibile per altri bundle, non notare che in realtà non usano il pacchetto Java, ma il proprio pacchetto.
Soluzione
In linea di principio questo è possibile. Unico problema è che se si specifica una classe nel pacchetto 'java', il programma di caricamento classe sole vietarlo:
Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.io
at java.lang.ClassLoader.preDefineClass(ClassLoader.java:480)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
Al fine di aggirare il problema, è necessario fornire i tuoi lezioni extra sul classpath boot:
$ java -Xbootclasspath:/home/user/Desktop/:/home/user/Desktop/rt.jar java.io.Hack
hacked
È quindi possibile anche sovrascrivere i file di sistema, per esempio java.io.File:
$ java -Xbootclasspath:/home/user/Desktop/:/home/user/Desktop/rt.jar java.io.File
Error occurred during initialization of VM
java.lang.NoSuchFieldError: separatorChar
at java.lang.Runtime.loadLibrary0(Runtime.java:819)
at java.lang.System.loadLibrary(System.java:1030)
at java.lang.System.initializeSystemClass(System.java:1077)
(mostrando che abbiamo appena a sovrascrivere java.io.File)
Quindi, è possibile ignorare le classi di sistema, il trucco è che è necessario avere accesso alla macchina virtuale. Non si può farlo al volo, che naturalmente è a causa di restrizioni di sicurezza.
Altri suggerimenti
Non è esattamente quello che stai chiedendo, ma Apache Harmony è un'implementazione Java SE alternativo che ha fatto uno sforzo per rendere modulare le API Java in modo che sia possibile installare solo i moduli che realmente bisogno, più è possibile fornire implementazioni alternative (anche se probabilmente non in fase di esecuzione).