equinox实现Class Loader机制的代码解读(3)

本文通过一个具体的实验展示了在团队开发中,当一个插件项目同时声明并从外部导入相同名称的包时会发生的情况。实验证明,如果bundle引入了一个与内部相同的包,则会使用外部导入的包而非内部定义的包。

在团队开发过程中,不可避免的会出现这样的情况:在bundle内部声明了一个Package的同时,又从外部Import进来相同的Package,这会导致什么情况发生呢?

来做个小实验。

1、创建两个plug-in的项目。

A、创建第一个插件项目


B、同样创建第二个插件项目

2、在每个项目里面除了不同的包,还要都声明一个相同的包名。
在相同的包名里面创建相同名称的类,如下图所示。

3、编写代码

A、第一个SameClass.java代码

packageorg.teamlet.samepackage;

publicclassSameClass{
publicvoidtoShow(){
System.out.println(
"***Iaminside!");
}
}


B、第二个SameClass.java代码

packageorg.teamlet.samepackage;

publicclassSameClass{
publicvoidtoShow(){
System.out.println(
"***Iamoutside!");
}
}

4、导出导入包

在第一个项目 equinox.evn.test.samepackage (包含"I am outside"内容)的 Manifest.MF文件中加入导出:

Export-Package: org.teamlet.samepackage

在第二个项目 org.teamlet.osgi.test(包含"I am inside"内容)的 Manifest.MF文件中加入导入:

Import-Package: org.osgi.framework;version="1.3.0",
org.teamlet.samepackage

5、增加调用

在第二个项目 org.teamlet.osgi.test 的Activator 中的 start()方法调用SameClass

publicvoidstart(BundleContextcontext)throwsException{
SameClasssc
=newSameClass();
sc.toShow();
}

6、执行

7、结论

如果bundle引入了一个和内部相同的包,那么使用的将是引入的包,而不是内部的包。

从《equinox实现Class Loader机制的代码解读(1)》中的class查找顺序可以看得很清楚。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值