j**a重新加载class文件

时间:2018.06.11 发布人:landa05

j**a重新加载class文件

已解决问题

谷歌landa05用户在2018.06.11提交了关于“马自达j**a重新加载class文件”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-03-03T14:17:37。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,不知道说什么,送你一朵小红花吧 !

希望以下的回答,能够帮助你。

第1个回答

用户名:匿名用户  

J**a类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保程序运行的基础类(像是基类)完全加载到jvm中,至于其他打硫继仅酸类,则在需要的时候才加载。这当然就是为了节酒广念零采烈生执北队省内存开销。

J**a的类加载器有三个,对应J**a的三种类:

Boot一分坚写冷啊材掉样抓贵strapLoade亲婷光为见当顾末r//负责加载系统类(指的是内置类,像是String,对应于C#中的System类和C/C++标准库中的类)

|

--ExtClassLoader//负责加载扩展类(就是继承类和实现类)

|

--AppClassLoader//负责加载应用类(程序料组府爱翻裂门员自定义的类)

三个加载器各自完成自己的工作,但它们是如何协调工作呢?哪一个类该由哪个类加载器完成呢?为了解决这个问题,J**a采用了委托模型机制。

委托模型机制的工着增无就作原理很简单:当类加载器需要加载类的时候,先请示其Parent(即未航病号沿甲缺初假居防上一层加载器)在其搜索路径载入,如果找不到,才在自己的搜索路径搜索该类。这样的顺序其实就是加载器层次上自顶而下的搜索,因为加载器必须保基础类的市云散朝几福统酒木二加载。之所以是这种机制,还有一个安全上的考虑:如果某人将下沙印约一个恶意的基础类加载到jvm,委托模型机制会搜索其父类加载器,显然是不可能找到的,眼力述景块什办自然就不会将该类加载进来。

我们可以通过这样的代码来获取类加载器:

ClassLoaderloader=ClassName.class.getClassLoader();

ClassLoaderParentLoader=loader.getParent();

注意一个很重要的问题,就是J**a在逻辑上并不存在B袁更首展组厚余段省ootstrapKLoader的实体!因为它是用C++编写的,铁口哥点培济存印识个所以打印其内容将会得到**ll。

前面是对类加载器的简单介绍,它的原理机制非常简单,就是下面几个步骤:

1.装载:查找和导入class文件;

2.连接:

(1)检查:检查载入的class文件**的正确性;

(2)准备:为类的静态变量分配存储空间;

(3)解析:将符号引用转换成直接引用(这一步是可选的)

3.初始化:初始化静态变量,静态代码块。

这样的过程在程序调用类的静态成员的时候开始执行,所以静态方法main()才会成为一般程序的入口方法。类的构造器也会引发该动作。