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

标签 java api osgi spoof

是否可以通过导出您自己的包来替换此 API 来欺骗标准 Java API 的一部分?当然具有相同的界面。

那么其他包是否有可能,而不是注意到它们实际上没有使用 java 包,而是您自己的包。

最佳答案

原则上这是可能的。唯一的问题是,如果您在“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)

所以你可以覆盖系统类,诀窍是你必须能够访问虚拟机。您不能即时执行此操作,这当然是由于安全限制。

关于java - 如何在 OSGi 中欺骗 java 包(以及 API 的一部分)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2245788/

相关文章:

java - 具有共享对象的 Tomcat 6 集群

iPhone 接近传感器

android - 如何频繁地从api获取数据?

java - 需要一个客户端 API 来确定 IP 地址的地理位置

java - 在 OSGi 中,如何优雅地处理初始化异常?

java - 如何防止 java.awt.List 覆盖 javax.swing.JMenu

java - 单个字符串可以包含多行吗?

java - Windows 保留名称 "c​on"解决方法/hack

java - 嵌入式OSGi : accessing dynamically loaded bundle components

java - OSGi 中的 Apache POI 3.17