java.で始まるクラス

小林さんとコメントでやりとりしてたヤツ。


java.で始まるクラスを、自前で用意すると、SecurityExceptionが出る。
予想通りというか、どうようというか。。。


java.lang.SecurityException: Prohibited package name: java.sql
at java.lang.ClassLoader.defineClass(ClassLoader.java:474)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:106)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:243)
at java.net.URLClassLoader.access$100(URLClassLoader.java:51)
at java.net.URLClassLoader$1.run(URLClassLoader.java:190)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:183)
at java.lang.ClassLoader.loadClass(ClassLoader.java:294)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:288)
at java.lang.ClassLoader.loadClass(ClassLoader.java:250)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:310)
at org.hsqldb.jdbcDriver.getConnection(Unknown Source)
....


ちなみに、例外発生させてる箇所のコード。


protected final Class defineClass(String name, byte[] b, int off, int len,
ProtectionDomain protectionDomain)
throws ClassFormatError
{
check();
if ( (name != null) && name.startsWith("java.") ) {
throw new SecurityException("Prohibited package name: " +
name.substring(0, name.lastIndexOf('.')));
}


追記:外部の1.4のrt.jarをクラスパスに追加しても同じだった。


追記:1.4以上でも、動くようにと思ってたけど、1.3だけの割り切りにする。