Javaで禁止されているパッケージ名



Prohibited Package Name Java



javaで始まるパッケージ(java.mypackage)が定義されているため、コンパイル時エラー:

java.lang.SecurityException: Prohibited package name: java.mypackage
at java.lang.ClassLoader.preDefineClass(ClassLoader.java:479)
at java.lang.ClassLoader.defineClass(ClassLoader.java:614)
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:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
Exception in thread 'main'


例外情報に従って、java.lang.ClassLoader.preDefineClassを見つけて、次のコードスニペットを見つけます。

/* Determine protection domain, and check that:
- not define java.* class,
- signer of this class matches signers for the rest of the classes in package.
*/
private ProtectionDomain preDefineClass(String name,
ProtectionDomain protectionDomain)
{
if (!checkName(name))
throw new NoClassDefFoundError('IllegalName: ' + name)
if ((name != null) && [color=red]name.startsWith('java.')[/color]) {
throw new SecurityException('Prohibited package name: ' +
name.substring(0, name.lastIndexOf('.')))
}
if (protectionDomain == null) {
protectionDomain = getDefaultDomain()
}

if (name != null)
checkCerts(name, protectionDomain.getCodeSource())

return protectionDomain
}

......

// true if the name is null or has the potential to be a valid binary name
private boolean checkName(String name)
if ((name == null)


preDefineClassメソッドが最初にクラス名をチェックし、Javaを第1レベルのパッケージ名として使用するとセキュリティ例外がスローされることがわかります。パッケージ名は禁止されています。

このセキュリティ例外は、Javaクラスによってロードされた「親委任モデル」が原因で発生します([url = http://idealab.iteye.com/blog/358592]ここ[/ url]を参照)。親委任モデルでは、親ローダークラスによってロードされたクラスは、下位層ローダーによってロードできません。この例では、最高レベルのローダーBootstrapClassLoaderは、クラスパスパスで定義されたjava。*パッケージのクラスをロードし、java.researchパッケージはBootstrapClassLoaderの下位ローダーAppClassLoaderによってロードできません。これは、Javaセキュリティメカニズムの悪意のあるコードに対する保護でもあります。

参照:[url] http://dev.csdn.net/develop/article/45/article/39/39272.shtm [/ url]