如果包名以”java“开始
如果我们写的Java类放在一个顶层包名为java的包里(如java.A,或者java.test.A),那么这个类将不能正常使用。
当new这类的时候,将会报错,抛出异常,异常信息:
Exception in thread "main" java.lang.SecurityException: Prohibited package name: javaat 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$100(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:268)at java.lang.ClassLoader.loadClass(ClassLoader.java:251)at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)at andy.MianClass.main(MianClass.java:9)
怎么会抛出这个异常呢?查看异常信息,进入ClassLoader类看看,发现:
private ProtectionDomain preDefineClass(String name, ProtectionDomain protectionDomain) {if (!checkName(name)) throw new NoClassDefFoundError("IllegalName: " + name);//注意这里,name是指类的完整路径,如:java.util.ArrayListif ((name != null) && name.startsWith("java.")) { 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; }看清楚了,加载类时JVM便会查看类的绝对路径,如果name.startsWith("java."),抛异常那是必须的。这是jdk的一个保护措施。
那么如果调用这个类(如:java.A)里的静态方法会如何?结果一样,抛异常。也就是说类如果像下面一样放在java包下,那么这个类所有方法(test1,test2),不管静态不静态,将不可用。
package java;public class A {public void test1(){//TODO}public static void test2(){//TODO}}问题到此似乎结束了。但是,jdk自己的以"java"开始的类(如:java.util.ArrayList),为何没有抛异常呢?解释应该只有一个,它没有调用这个方法。但,具体是怎么回事,就不知道了。
还有,如果我们在类A里写个mian函数,会怎样呢?
不仅报异常,还有个错误对话框弹出来,何解?

望达人解答!或者提供解答方法。感激涕零……
受益颇深,感谢楼主