Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类加载器如何在具有相同包和名称的多个类之间进行选择_Java_Android_Classloader - Fatal编程技术网

Java 类加载器如何在具有相同包和名称的多个类之间进行选择

Java 类加载器如何在具有相同包和名称的多个类之间进行选择,java,android,classloader,Java,Android,Classloader,我正在编写一个Android项目,该项目需要使用4.1版的ApacheHttpClient。我将它作为jar文件包含在项目的libs文件夹中。我的问题是类加载器如何知道使用版本4类而不是平台提供的版本3,因为它们都具有相同的包名和相同的导入语句 我在过去使用GSON库时遇到了一个问题,它与HTC提供的库冲突,我想知道这些情况有什么不同(可能是因为GSON使用的是反射?)?任何信息都非常感谢。我不知道Android,但如果它与JBoss类似,例如,那么你有自定义类加载器,首先在应用程序类路径中查找

我正在编写一个Android项目,该项目需要使用4.1版的ApacheHttpClient。我将它作为jar文件包含在项目的libs文件夹中。我的问题是类加载器如何知道使用版本4类而不是平台提供的版本3,因为它们都具有相同的包名和相同的导入语句


我在过去使用GSON库时遇到了一个问题,它与HTC提供的库冲突,我想知道这些情况有什么不同(可能是因为GSON使用的是反射?)?任何信息都非常感谢。

我不知道Android,但如果它与JBoss类似,例如,那么你有自定义类加载器,首先在应用程序类路径中查找,如果没有找到,他们会检查系统类路径。正如我所说,我不确定Android是否也是如此。

HttpClient 4和HttpClient 3是两个完全不同的库。HttpClient4是一个完全重写的版本,它的设计遵循了许多原则


HttpClient 4与HttpClient 3不向后兼容。

类加载器首先查看其类,然后询问父类加载器。 问题可能是父类加载器有一个在android中工作的补丁类,而您提供的版本不是。这可能会导致问题

长话短说: 类加载器存储在树中,当找不到该类时,会询问父类加载器。
(自定义类加载器可能会做一些不同的事情!)

您的情况没有什么不同。如果要确保加载的是类,而不是操作系统提供的类,那么还应该重命名这些包。使用jarjar更改HttpClient包是否有帮助?当然可以,但是HttpClient对两个libs都有相同的包名,不是吗?完全不是,有些类可能有相同的包名,但方法签名/构造函数完全不同。是的,但该类是基于import语句加载的,而不是@Dori,类加载器将询问其父类加载器,以查找具有特定构造函数/方法签名的类。无论谁拥有它,都会返回该对象,否则它会找到它自己。+1这很有意义。在这种情况下,上面提到的错误是如何发生的?我原以为系统中包含的GSON lob会与父类加载器关联?