如何在OSGi中欺骗java包(以及API的一部分)?

时间:2010-02-11 16:10:47

标签: java api osgi spoof

是否可以通过导出替换此API的自己的bundle来欺骗标准Java API的一部分?当然有相同的接口。

是否可以使用其他捆绑包,而不是注意到实际上他们没有使用java包,而是你自己的包。

2 个答案:

答案 0 :(得分:6)

原则上这是可能的。唯一的问题是,如果你在'java'包中指定一个类,那么sun类加载器将禁止它:

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)

因此,您可以覆盖系统类,诀窍是您必须有权访问虚拟机。你不能动态地做,这当然是出于安全限制。

答案 1 :(得分:1)

这并不是你要求的,但Apache Harmony是一个替代的Java SE实现,它已经努力模块化Java API,因此可以只安装你真正需要的模块,而且你可以提供替代实现(虽然可能不是在运行时)。

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