【问题标题】:Where does Class.forName(String className) look for the class name?Class.forName(String className) 在哪里寻找类名?
【发布时间】:2014-08-30 04:50:01
【问题描述】:

我查看了http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html,看到了 class.forname(String className) 和“返回与类关联的 Class 对象”这个方法在哪里寻找类?它是否在调用该方法的类的java项目的包中?如果有多个同名的类怎么办? Api 没有讨论这些情况

【问题讨论】:

  • 默认查看位置是在您运行程序的文件夹中。如果您在 bin 中并且正在加载 /some/package/Myclass,它将搜索 bin/some/package/Myclass.class。但是,如果您的路径中有多个文件夹并且存在多个文件,我不确定会发生什么(尽管我认为这会给您某种例外)。

标签: java class package project instance


【解决方案1】:

如果您仔细阅读 JavaDoc,您会看到以下内容:

返回与具有给定字符串名称的类或接口关联的 Class 对象。调用此方法等效于:

  Class.forName(className, true, currentLoader)

其中 currentLoader 表示当前类的定义类加载器。

这意味着该类将从当前类加载器加载,如果没有这样的类,类加载器很可能会委托给它的父类(具体行为取决于它是什么类加载器)。

如果有多个同名的类怎么办?

如上所述,类加载器层次结构将尝试加载最具体的类,即从知道该名称的类的最具体的类加载器。

由于类名必须是完全限定的类名,即"java.lang.String" 而不仅仅是"String",因此每个类加载器都是唯一的。

如果您的类路径中有多个包含相同类的库,则取决于类加载器和类加载器层次结构,哪些类被加​​载和返回。

【讨论】:

    【解决方案2】:

    首先它将在当前项目中查找,如果找到则停止搜索..
    其次,如果它没有找到,那么它会检查依赖的 jar,这些依赖 jar 是 jdk 的内置 jar .. 如果仍然没有找到,那么它会在外部 jar 中查找..

    在这个过程中,如果在中间找到它就会停止搜索..所以即使有多个同名的类也没问题..只需要一个..
    重要的是,任何类都只被 JVM 加载一次..

    【讨论】:

    • Importantly any class is loading by JVM only once.. 不完全是,每个类加载器只有一次,您可以拥有多个。
    • @Thomas 感谢您的纠正。我什至知道类加载器子系统只加载一次类。但是在输入时突然想到 JVM。:P
    【解决方案3】:

    它在类路径中查找给定的类。如果存在多个具有相同包/名称的类,则使用第一个。

    【讨论】:

    猜你喜欢
    • 2015-01-16
    • 1970-01-01
    • 2023-03-18
    • 2019-05-02
    • 2012-05-21
    • 2011-08-01
    • 2015-07-28
    • 2018-06-24
    • 2017-05-23
    相关资源
    最近更新 更多