gradle系列-编译不同module中相同包名类名的java文件

问题

在我们的工程使用中,如果存在相同名称的Java类名,但是也是包名不同来区分,但是如果我们依赖的库中存在两个相同的类名,并且包名也相同的两个类时,gradle编译后会是什么现象呢?让我们带着这个问题来继续下面的实验。

创建工程

让我们创建一个demo工程,并新建一个lib库依赖
在这里插入图片描述
让我们现在app下创建一个Utils类,然后在utillibs模块下创建一个包名类名完全跟Utils相同的类。

在这里插入图片描述

在app工程下使用Utils类

在这里插入图片描述
查看调用log:

2020-05-07 21:49:05.163 11451-11451/com.baidu.testgradlelibsameclass D/glttest app: testLib: in app

根据当前实验现象,可以看到,一个工程下存在相同的包名和类名的类,在App中调用是 调用的的app module下的Utils。

在lib模块下调用

在这里插入图片描述
我们在utillibs工程下调用Utils,会发现在代码中能够看到 lib工程下的Utils的两个方法。然后我们依然在app下调用Same.same(); 查看log:

2020-05-07 21:55:26.195 13767-13767/com.baidu.testgradlelibsameclass D/glttest app: testLib: in app

我们看到输出依然是app下的Utils输出。
那么我们在调用下另外一个方法testUse运行下看下效果:

Process: com.baidu.testgradlelibsameclass, PID: 14803
    java.lang.NoSuchMethodError: No static method testUse()V in class Lcom/baidu/testgradlelibsameclass/utils/Utils; or its super classes (declaration of 'com.baidu.testgradlelibsameclass.utils.Utils' appears in /data/app/com.baidu.testgradlelibsameclass-UPUGAABZ0rsMyM48SfkUJQ==/base.apk!classes2.dex)
        at com.baidu.testgradlelibsameclass.utils.Same.same(Same.java:8)
        at com.baidu.testgradlelibsameclass.MainActivity$1.onClick(MainActivity.java:32)
        at android.view.View.performClick(View.java:6668)
        at android.view.View.performClickInternal(View.java:6639)

可以看到会报错。

结论

从上述两个实验中,我们可以得出结论,如果存在多个模块 含有相同的包名和类名的 java类,编译器最后会以app模块下的类为准。其他模块下的被忽略丢弃。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值