首页 > Java > java教程 > 正文

Java 中的类加载器

王林
发布: 2024-08-30 16:04:05
原创
887 人浏览过

ClassLoader 是一个负责在运行时动态加载 Java 类的对象,以防止 JVM 意识到 ClassLoader 是 Java 运行时环境的一部分。它使 JVM 的生活更轻松。 JVM 在应用程序需要时将类加载到内存中,并且不会一次性加载所有类。然后 ClassLoader 介入并将类加载到内存中。

开始您的免费软件开发课程

网络开发、编程语言、软件测试及其他

如何用Java实现类加载器?

让我们看看 java.lang.ClassLoader 在 Java 库代码中是如何实现的以及它的功能是什么。

java.lang.ClassLoader:

public abstract class ClassLoader {
public class loadClass(String name);
protected class defineClass(byte[] b);
public URL getResource(String name);
public Enumeration getResources(String name);
public ClassLoader getParent()
};
登录后复制

我们来看看java中的ClassLoader有哪些功能:

  • loadClass(): 这是一个重要的方法,它将类的名称作为字符串并返回类的实例,这将是类加载器的类在其类路径中找到,它将提供它,以便可以从中实例化对象。
  • defineClass(): 此方法的工作方式与 loadClass 方法类似,不同之处在于它采用字节数组作为参数,然后从该字节数组创建一个类,这意味着它采用类本身作为字节数组。它与 loadClass 方法略有不同,因为类本身以字节数组的形式给出,而 loadClass 需要找到该类来加载它。
  • getResource() 或 getResources(): 此方法是诊断与加载类相关的任何问题的关键,因为当您提供字符串名称和包名。它将为您提供类加载位置和加载方式的确切路径,保留您的所有假设。
  • getparent():是理解classLoader层次结构的关键方法。 ClassLoader 不是一个平面结构,并且有父级和子级层次结构以及级别和级别的结构。

Java 中的 ClassLoader 是如何工作的?

演示类加载器如何工作的示例:

代码:

public class A() {
public void addOne() {
B b = new B();
b.addTwo();
}
}
登录后复制

ClassLoader 在上述场景中如何加载类:

  • 我们可以看到,在上面的代码中,类 A 调用了函数 addOne()。在该函数内部,创建了 B 类的实例,并调用了 B 类的另一个方法 addTwo()。
  • 所以类加载器会加载类A,然后类加载器会加载类B。所以调用会像class.getClassLoader().loadClass(“B”);
  • 由于类加载器的这一特性,我们可以拥有类的层次结构并解码它们的连接。

类加载器的类型

在本教程中,我们将讨论不同类型的类加载器及其内置功能以及使用它的原因。

1.引导类加载器

  • Java ClassLoader 也是 java.lang 的一个实例。 ClassLoader,它是一个类,试想一下谁会加载ClassLoader类。我们将看到 Bootstrap ClassLoader 出现的场景。
  • 它将加载 $JAVA_HOME/jre/lib 目录中的所有 rt.jar 和其他核心库。
  • 它充当所有其他类加载器实例的父级。
  • 它是 JVM 部分之一,用 Native 代码编写;因此,这个特定的 ClassLoader 的实现可能会发生变化。

2.扩展类加载器

扩展类加载器是 Bootstrap 的子类。它用于加载进入 JVM 的所有 Java 类的扩展。

3.应用程序类加载器

  • 它是扩展类加载器的子级。
  • 用于加载类路径环境变量--classpath或--cp中的所有应用程序级类。

类加载器泄漏

每个类都有一个指向它创建的所有类的链接。它实际上需要有一个内存来存储静态字段。如果 classLoader 泄漏任何单个类的任何静态字段,则仅意味着您泄漏了 ClassLoader。如果这样做,您将泄漏所有类和一堆对象以及它们链接到的所有对象。类加载器泄漏可能太危险了。

每次我们在应用程序的运行时进行重新部署或添加增强功能时,ClassLoader 都会加载一个类,而不会重新加载或卸载一个类。因此,当类加载器从头开始加载单个类时,它将具有一些对象,以便从头开始重新创建或重新加载它,旧类加载器将对象从旧状态发送到新状态。所以在这个转变过程中,可能会出现泄漏。所以当你泄漏一个对象时,你就泄漏了一个类,所以它是类加载器。

Principles of Java ClassLoader

There are 3 principles that a java ClassLoader works upon:

  • Delegation Model: It delegates class loading requests to parent ClassLoader and loads class only if the parent is not able to find or load the class.
  • Visibility Principle: This principle states the visibility scope of loaded classes. Class loaded by its parent is visible to parent class loaders, but the class loaded by its child is not visible to the parent class loader.
  • Uniqueness Property: It ensures that there is no repetition of classes in the class loader. If a parent loads a class, then its corresponding child does not load this class.

Example of Custom ClassLoader

This is the custom ClassLoader example named with ClassLoaderJava.java:

Code: ClassLoaderJava.java

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ClassLoaderJava extends ClassLoader{
// created to load class and invoke method.
public void classLoadingDemo(String classBinString, String methodName) {
try {
// will create an instance of class loader. ClassLoader classLoaderInstance =
this.getClass().getClassLoader();
// creating an instance of a class to store the loaded class. Class loadedClass =
classLoaderInstance.loadClass(classBinString);
System.out.println("Loaded class name is: " + loadedClass.getName());
// Fetching the constructor of loaded class. Constructor con = loadedClass.getConstructor();
// creating an instance to invoke the method. Object obj = con.newInstance();
// Will store the method fetched from loaded class.
Method invokingMethod = loadedClass.getMethod(methodName); System.out.println("Invoked method name is: " +
invokingMethod.getName());
invokingMethod.invoke(obj);
} catch (ClassNotFoundException e) { e.printStackTrace();
} catch (Exception e) { e.printStackTrace();
}
}
}
登录后复制

Code: DemoClass.java

public class DemoClass {
public void add() {
System.out.println("This method is invoked by the classLoader.");
}
}
登录后复制

Code: LoadingTest.java

public  class  LoadingTest  {
public  static  void  main(String[]  args)  {
ClassLoaderJava classLoader = new ClassLoaderJava();
classLoader.classLoadingDemo("DemoClass" , "add");
}
}
登录后复制

Output:

Java 中的类加载器

以上是Java 中的类加载器的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!