Java 导入的相对路径
我想知道java中是否有一种方法可以使用相对包路径进行导入。大概是这样的:Java 导入的相对路径,java,android,white-labelling,Java,Android,White Labelling,我想知道java中是否有一种方法可以使用相对包路径进行导入。大概是这样的: import *.fragments.MyFragment; 如果我有一个白标应用程序,我想让主应用程序有一个“MyFragment”的定义,但需要一种产品风格来定义它,那么我会使用它 课程是完全合格的东西。即使您可以从所有包中导入名为Object的所有类,运行时也必须知道在任何给定语句中要使用哪个类。如果没有完全限定的名称(这正是import语句的目的),运行库绝对无法知道您想要哪个类。而且,如果两个类共享相同的规范
import *.fragments.MyFragment;
如果我有一个白标应用程序,我想让主应用程序有一个“MyFragment”的定义,但需要一种产品风格来定义它,那么我会使用它
课程是完全合格的东西。即使您可以从所有包中导入名为Object的所有类,运行时也必须知道在任何给定语句中要使用哪个类。如果没有完全限定的名称(这正是import语句的目的),运行库绝对无法知道您想要哪个类。而且,如果两个类共享相同的规范名称,那么它们就是同一个类
完整地说,在vanilla java中,实际上可以将两个同名的类加载到同一个运行时中。但是,必须使用指向不同jar的不同类加载器。您还可以巧妙地构建类路径,以便在同一类加载器中隐藏其他类(您将得到类路径上的第一个类)。但是android构建系统不允许您使用相同的规范名称dex
多个类。您将得到一个DexException
,因为过去所有的东西都被压缩到相同的类.dex
文件中。我不知道这个限制是否在multidex世界中放宽了
要想做你想做的事情,你可以简单地利用风味特定的源代码集。因此,您需要src/flavor1/java
包含该类的一个定义,然后src/flavor2/java
包含同一类的另一个定义。如果这样做,则不能在主源集中定义该类,必须在每个flavor的源集中独立定义该类
注意,口味通常定义产品类型和flavor!=变体
。所以你想要一个普通的
和一个白标签的
味道。在使用普通片段构建的普通味道中。在白标风味中,您使用不同的碎片构建。那只是两个不同的班级
除此之外,您还可以进入普通的旧依赖项注入和接口,您可以选择它们,以便将您的构建理念从flavors和gradle方便的源集概念中解放出来。作为@dcow答案的扩展-
您可以在维度中组合口味。因此,如果你想有4种口味,并且只有两种不同的视图-再添加两种口味,将它们设置为一个维度,将初始口味设置为另一个维度。在那之后,建立你需要的任何组合
android {
...
flavorDimensions "appversion", "appserver"
productFlavors {
free {
applicationId = "com.myapp.free"
dimension "appversion"
}
paid {
applicationId = "com.myapp.paid"
dimension "appversion"
}
server1{
dimension "appserver"
}
server2{
dimension "appserver"
}
}
}
这会有什么帮助呢?因为否则,应用程序会忘记产品口味的变化。如果我将导入路径硬编码到应用程序的主代码中,它将继续使用该包的类版本,而不是产品风格的问题,但是*.fragments.MyFragment
如何消除歧义?导入对开发人员来说是一种方便。在运行时,类总是完全限定的。是的,我知道,但这有点离题了。关键是我想使用一个相对于特定产品风格的包路径,但这正是问题所在。我不想对每种产品的口味都进行更改,只想根据需要更改特定的口味。@KairisCharm通过对build.gradle进行一些更改,您可以添加一个源集,该源集在多个口味之间共享。这意味着您可以有两个版本的片段,每个版本都在各自的源集中。然后每个味道都可以声明它使用的源集。@KairisCharm我怀疑您没有正确使用味道。我正要添加这个,但不记得您是否为每个维度获得了单独的源集。我不认为你会这么做,我不确定这有助于清理局面。正如在一篇评论中指出的,您可以手动将一个新的源集添加到所需的口味中,以便多个口味共享同一个源集,从而无需将相同的类复制粘贴到多个特定于口味的集合中。