java 运行总是在其他工程_如何在运行时可以加载其他java工程的class

如何在运行时可以加载其他java工程的class

关注:72  答案:2  mip版

解决时间 2021-02-05 19:13

e6cb1a03ad541b3098697807b7bf1798.png

提问者傃顏莄蒾亾

2021-02-04 23:00

如何在运行时可以加载其他java工程的class

最佳答案

e6cb1a03ad541b3098697807b7bf1798.png

二级知识专家敌不过时间逃不过距离

2021-02-04 23:48

应该可以,反射机制实现

全部回答

e6cb1a03ad541b3098697807b7bf1798.png

1楼薯片软妹

2021-02-05 00:52

java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到jvm中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存开销。

java的类加载器有三个,对应java的三种类:

bootstrap loader // 负责加载系统类 (指的是内置类,像是string,对应于c#中的system类和c/c++标准库中的类)

|

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

|

- - appclassloader // 负责加载应用类(程序员自定义的类)

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

委托模型机制的工作原理很简单:当类加载器需要加载类的时候,先请示其parent(即上一层加载器)在其搜索路径载入,如果找不到,才在自己的搜索路径搜索该类。这样的顺序其实就是加载器层次上自顶而下的搜索,因为加载器必须保证基础类的加载。之所以是这种机制,还有一个安全上的考虑:如果某人将一个恶意的基础类加载到jvm,委托模型机制会搜索其父类加载器,显然是不可能找到的,自然就不会将该类加载进来。

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

classloader loader = classname.class.getclassloader();

classloader parentloader = loader.getparent();

注意一个很重要的问题,就是java在逻辑上并不存在bootstrapkloader的实体!因为它是用c++编写的,所以打印其内容将会得到null。

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

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

2.连接:

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

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

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

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

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

我要举报

如以上问答内容为低俗/色情/暴力/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!

→点此我要举报以上信息!←

推荐资讯

大家都在看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值