是否可以通過導出替換此API的自己的包來欺騙部分標準Java API?當然有相同的接口。如何在OSGi中欺騙java包(以及API的一部分)?
對於其他軟件包是否可以使用,而不是注意到它們實際上並未使用java軟件包,而是您自己的軟件包。
是否可以通過導出替換此API的自己的包來欺騙部分標準Java API?當然有相同的接口。如何在OSGi中欺騙java包(以及API的一部分)?
對於其他軟件包是否可以使用,而不是注意到它們實際上並未使用java軟件包,而是您自己的軟件包。
原則上這是可能的。唯一的缺點是,如果你指定的「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)
所以你可以覆蓋系統類,訣竅是你必須有權訪問虛擬機。你不能隨時進行,這當然是由於安全限制。
這並不完全符合您的要求,但Apache Harmony是一個備用Java SE實現,它已經努力模塊化Java API,因此可以只安裝實際需要的模塊,另外還可以提供備用實現(儘管可能不在運行時)。
這也非常有用。我會研究它,謝謝。 – Falx 2010-02-16 08:17:29
非常感謝你,這是非常有用的! – Falx 2010-02-12 08:19:03