2010-02-11 54 views

回答

6

原則上這是可能的。唯一的缺點是,如果你指定的「Java」作爲包中的類,在陽光的類加載器將禁止它:

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) 

爲了規避這個問題,你需要提供引導類路徑的額外的類:

$ java -Xbootclasspath:/home/user/Desktop/:/home/user/Desktop/rt.jar java.io.Hack 
hacked 

然後,您可以也覆蓋系統文件,比如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) 

(可見我們剛剛推翻的java.io.File)

所以你可以覆蓋系統類,訣竅是你必須有權訪問虛擬機。你不能隨時進行,這當然是由於安全限制。

+0

非常感謝你,這是非常有用的! – Falx 2010-02-12 08:19:03

1

這並不完全符合您的要求,但Apache Harmony是一個備用Java SE實現,它已經努力模塊化Java API,因此可以只安裝實際需要的模塊,另外還可以提供備用實現(儘管可能不在運行時)。

退房: http://wiki.apache.org/harmony/componentization

+0

這也非常有用。我會研究它,謝謝。 – Falx 2010-02-16 08:17:29