本文主要是介绍Java应用类的包名为什么不能以java.开头?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
转自 http://blog.csdn.net/zhangzeyuaaa/article/details/42531135
我们自己编写的Java类默认情况下都由系统类加载器加载。系统类加载器也是ClassLoader的子类,也是通过调用ClassLoader.loadClass(name)方法来加载类,而扩展ClassLoader类的一般做法就是重写findClass(name)方法,然后调用defineClass(String name, byte[] b, int off, int len)返回。所以我们可以直接看ClassLoader的defineClass(String name, byte[] b, int off, int len)方法。
defineClass(String name, byte[] b, int off, int len)方法:
- protected final Class<?> defineClass(String name, byte[] b, int off, int len)
- throws ClassFormatError
- {
- return defineClass(name, b, off, len, null);
- }
- protected final Class<?> defineClass(String name, byte[] b, int off, int len,
- ProtectionDomain protectionDomain)
- throws ClassFormatError
- {
- check();
- protectionDomain = preDefineClass(name, protectionDomain);
- Class c = null;
- String source = defineClassSourceLocation(protectionDomain);
- try {
- c = defineClass1(name, b, off, len, protectionDomain, source);
- } catch (ClassFormatError cfe) {
- c = defineTransformedClass(name, b, off, len, protectionDomain, cfe, source);
- }
- postDefineClass(c, protectionDomain);
- return c;
- }
- if ((name != null) && name.startsWith("java.")) {
- throw new SecurityException("Prohibited package name: " +
- name.substring(0, name.lastIndexOf('.')));
- }
当然,检测包名不只这么简单,正式加载字节码文件的时候还会对包名进行检测。
这篇关于Java应用类的包名为什么不能以java.开头?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!