原则上这是可能的.唯一的问题是如果你在'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)
Run Code Online (Sandbox Code Playgroud)
为了避免这个问题,您需要在引导类路径上提供额外的类:
$ java -Xbootclasspath:/home/user/Desktop/:/home/user/Desktop/rt.jar java.io.Hack
hacked
Run Code Online (Sandbox Code Playgroud)
然后,您还可以覆盖系统文件,例如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)
Run Code Online (Sandbox Code Playgroud)
(显示我们只是覆盖了java.io.File)
所以你可以覆盖系统类,诀窍是你必须有权访问虚拟机.你不能动态地做,这当然是由于安全限制.
归档时间: |
|
查看次数: |
1021 次 |
最近记录: |