HashMap - Java

Constructor

HashMap<K,​V>

HashMap()

Map<K,V> oneMap = newHashMap<K,V>();

查看更多

SecurityException Prohibited package name java

报错:

java.lang.SecurityException: Prohibited package name: java

1
2
3
4
Connected to the target VM, address: '127.0.0.1:63225', transport: 'socket'
java.lang.SecurityException: Prohibited package name: java
at java.lang.ClassLoader.preDefineClass(ClassLoader.java:662)
at java.lang.ClassLoader.defineClass(ClassLoader.java:761)

原因:

定位到java.lang.ClassLoader.preDefineClass ,可以看出preDefineClass方法首先对类名进行了检查,发现以java作为一级包名,则抛出安全异常:禁止使用的包名!

查看更多

类加载

类加载过程

虚拟机将 .class 加载入内存,运行时进行

  • 加载
    • 读取.class数据,转化成 方法区的数据结构
    • 生成一个 java.lang.Class对象 ,作为该数据的访问入口
  • 验证
    • 文件格式验证:验证字节流是否符合Class文件格式的规范。
    • 元数据验证:要符合Java语言规范
    • 字节码验证:类的方法体 的校验分析
    • 符号引用验证:发生在解析阶段
  • 准备 静态变量赋值
    • static 变量 内存分配
    • static 变量 设置初始值
      • 初始值是 变量数据类型的默认值
      • final 修饰成常量时 初始值为 被赋予的值
  • 解析
    • 符号引用转换为直接引用
      • 符号引用:编译期间的内存具体位置的占位符
      • 直接引用:直接或间接指向目标内存位置
      • 引用的类型未加载初始化:触发这个引用对应类型的加载和初始化
  • 初始化 主动资源初始化
    • static变量 会赋予实际代码赋予的值
    • static代码块 会执行里面的代码

方法区中,使用同一加载器的情况下,每个类只会有一份Class字节流信息
Java堆中,使用同一加载器的情况下,每个类只会有一份 java.lang.Class 类的对象

类加载器

查看更多