自定义包不能以java开头和为什么不能自定义java.lang.String 类
2012-10-26 10:10
357 查看
这里说一下为什么自定义的包不能以 java.xxx.xx 开头,这是一种安全机制,如果以java开头,则直接异常
如果自己定义了一个 java.lang.String 类,然后执行此类中的方法会出现什么情况 ?
java.lang.NoSuchMethodError: main
Exception in thread "main"
会发出上面的异常,为什么呢?
因为Java的类加载机制造成的,类的加载机制为双亲委派模型,也就是先交给其父亲加载器去加载,如果父亲加载不到,那么再由自己加载
我们自己定义的类一般都由AppClassLoader 进行加载,而它的父亲为ExtclassLoader,而 ExtClassloader的父亲则是 BoostrapClasslader,所以我们自定义的
java.lang.String 最先由 BootStrapClassLoader 加载,而BootStrapLoader 加载器由C++写,它负责加载系统中的类库,而java.lang.string 正是系统中的类,已经被
BootStrapLoader 加载过了,所以不需要再加载 java.lang.String(虽然我们写的与系统中的不是一个,但名字是一样的),所以这样就会免去了加载而直接执行java.lang.String
中的main方法,而系统中的java.lang.string 中没有main 方法,这也就出现了上面的异常
private ProtectionDomain preDefineClass(String name, ProtectionDomain protectionDomain) { if (!checkName(name)) throw new NoClassDefFoundError("IllegalName: " + name); if ((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; }
如果自己定义了一个 java.lang.String 类,然后执行此类中的方法会出现什么情况 ?
java.lang.NoSuchMethodError: main
Exception in thread "main"
会发出上面的异常,为什么呢?
因为Java的类加载机制造成的,类的加载机制为双亲委派模型,也就是先交给其父亲加载器去加载,如果父亲加载不到,那么再由自己加载
我们自己定义的类一般都由AppClassLoader 进行加载,而它的父亲为ExtclassLoader,而 ExtClassloader的父亲则是 BoostrapClasslader,所以我们自定义的
java.lang.String 最先由 BootStrapClassLoader 加载,而BootStrapLoader 加载器由C++写,它负责加载系统中的类库,而java.lang.string 正是系统中的类,已经被
BootStrapLoader 加载过了,所以不需要再加载 java.lang.String(虽然我们写的与系统中的不是一个,但名字是一样的),所以这样就会免去了加载而直接执行java.lang.String
中的main方法,而系统中的java.lang.string 中没有main 方法,这也就出现了上面的异常
相关文章推荐
- 为什么不能自定义java.lang.String
- 为什么不能自定义java.lang.String
- 可以自定义一个Java.lang.String/Math这样的类么?
- 为什么java中的String要设计成不能改变的类型
- 为什么Java的String对象不能改变
- AS里不能编译,提示incompatible types required java.lang.String found java.lang.String
- 为什么Java的String对象不能改变
- eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错? java.lang.ClassNotFoundException: com.branchitech.app.startup.AppStartupContextListener java.lang.ClassN
- java基础---String对象为什么不能改变?
- ClassLoader的双亲代理机制和能否自定义一个java.lang.String类
- Spring和HIbernate整合配置数据源 出现 'java.lang.String'不能转换为java.lang.class
- 关于[Ljava.lang.String;不能转换为java.lang.String错误
- Java应用类的包名为什么不能以java.开头?
- Java应用类的包名为什么不能以java.开头?
- 源码分析 There is no getter for property named '*' in 'class java.lang.String
- java.lang.Integer cannot be cast to java.lang.String Java int,double向String的转化和String向int,double的转换
- java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/Str
- Failed to convert property value of type [java.lang.String] to required type [java.util.Date] for pr
- invalid comparison: com.XXX.shop.util.PageUtil and java.lang.String
- Java.lang.String 类常用方法