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.

È stato utile?

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).

Check out: http://wiki.apache.org/harmony/componentization

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top