Как подделать Java-пакет (и, следовательно, часть API) в OSGi? - PullRequest
1 голос
/ 11 февраля 2010

Можно ли подделать часть стандартного Java API, экспортировав собственный пакет, заменяющий этот API? Конечно с такими же интерфейсами.

Будет ли тогда возможность для других пакетов не замечать, что на самом деле они используют не пакет java, а ваш собственный пакет.

Ответы [ 2 ]

6 голосов
/ 11 февраля 2010

В принципе это возможно. Единственный улов в том, что если вы укажете класс в пакете 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 голос
/ 15 февраля 2010

Это не совсем то, что вы просите, но Apache Harmony - альтернативная реализация Java SE, которая предприняла попытку модульной реализации API-интерфейсов Java, чтобы можно было устанавливать только те модули, которые вам действительно нужны, плюс вы можете предоставить альтернативные реализации. (хотя, вероятно, не во время выполнения).

Выезд: http://wiki.apache.org/harmony/componentization

...