当前位置: 首页 > 面试题库 >

Java ClassLoader委托模型?

莫河
2023-03-14
问题内容

调用loadClass()ClassLoaderClassLoader首先检查该类是否已加载,还是立即将该检查委托给其父级ClassLoader

Java API说:

当请求查找类或资源时,ClassLoader实例会将对类或资源的搜索委托给其父类加载器,然后再尝试查找类或资源本身。

但是在《 Java Reflection in Action》 一书中有一章关于类加载器的特定章节说:

类加载器调用findLoadedClass来检查该类是否已经加载。如果类加载器找不到加载的类,请在父类加载器上调用loadClass。

哪个是正确的?


问题答案:

正确的类加载器实现将:

  1. 检查该类是否已经加载。
  2. 通常要求父类加载器加载该类
  3. 尝试在自己的班级路径中查找班级。

ClassLoader.loadClass的默认实现是这样的:

protected synchronized Class<?> loadClass(String name, boolean resolve) {
  // First, check if this class loader has directly defined the class or if the
  // JVM has initiated the class load with this class loader.
  Class<?> result = findLoadedClass(name);
  if (result == null) {
    try {
      // Next, delegate to the parent.
      result = getParent().loadClass(name);
    } catch (ClassNotFoundException ex) {
      // Finally, search locally if the parent could not find the class.
      result = findClass(ex);
    }
  }
  // As a remnant of J2SE 1.0.2, link the class if a subclass of the class
  // loader class requested it (the JVM never calls the method,
  // loadClass(String) passes false, and the protected access modifier prevents
  // callers from passing true).
  if (resolve) {
    resolveClass(result);
  }
  return result;
}

一些类加载器实现将委派给其他非父类加载器(例如,OSGi,取决于包,委派给类加载器的图),而某些类加载器实现会在委派之前在本地类路径中查找类。



 类似资料:
  • 我有一个简单的自定义ClassLoader 下面是我试图使用加载器的代码: 结果是相当令人期待的: 在大多数文章中,您可以看到,当您在自定义加载程序上调用loadClass时,它首先尝试在其缓存中查找该类。如果找不到,则从父加载程序(在本例中为应用程序加载程序)调用loadClass方法。引导加载程序也是如此。之后,如果引导加载程序在其缓存中找不到该类,它将尝试在相应的源中找到该类。如果加载程序找

  • 主要内容:类委托,属性委托,标准委托,可观察属性 Observable,把属性储存在映射中,Not Null,局部委托属性,属性委托要求,翻译规则,提供委托委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。 Kotlin 直接支持委托模式,更加优雅,简洁。Kotlin 通过关键字 by 实现委托。 类委托 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。 以下实例中派生类 Derived 继承了接口

  • 主要内容:声明委托,实例化委托,多播委托(合并委托)C# 中的委托(Delegate)类似于 C 或 C++ 中的函数指针,是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。委托特别适用于实现事件和回调方法,所有的委托都派生自 System.Delegate 类。在实例化委托时,可以将委托的实例与具有相同返回值类型的方法相关联,这样就可以通过委托来调用方法。另外,使用委托还可以将方法作为参数传递给其他方法, 委托具有以下特点: 委托类似

  • 关于“行为委派”的良好讨论可以在 找到。

  • 委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。 Kotlin 直接支持委托模式,更加优雅,简洁。Kotlin 通过关键字 by 实现委托。 类委托 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。 以下实例中派生类 Derived 继承了接口 Base 所有方法,并且委托一个传入的 Base 类的

  • 委托 装饰者模式的另一种实现方案是委托。在这种机制下,一个对象可以和另一个对象相关联。比如你在用 UITableView ,你必须实现 tableView(_:numberOfRowsInSection:) 这个委托方法。 你不应该指望 UITableView 知道你有多少数据,这是个应用层该解决的问题。所以,数据相关的计算应该通过 UITableView 的委托来解决。这样可以让 UITable