Java类加载器的用途是什么?

Java类加载器的用途是什么?,java,classloader,Java,Classloader,我的问题是,JVM何时加载项目中的所有类?还有,为什么我们需要类加载器的概念呢 如果您能给我一个使用类加载器的例子,以及为什么在这种情况下使用类加载器,我会很高兴 JVM何时加载项目中的所有类。 JVM或多或少地“按需”加载类。即,运行时中的所有类通常不会在启动时加载 有关此主题的详细信息,请参阅以下URL: 为什么我们需要类加载器的概念 类装入器允许我们从各种来源装入类 磁盘上的jar文件 运行时生成的字节数组 来自互联网(这是小程序的典型用例) 这使得应用程序的启动更加灵活和模块

我的问题是,JVM何时加载项目中的所有类?还有,为什么我们需要类加载器的概念呢

如果您能给我一个使用类加载器的例子,以及为什么在这种情况下使用类加载器,我会很高兴

JVM何时加载项目中的所有类。

JVM或多或少地“按需”加载类。即,运行时中的所有类通常不会在启动时加载

有关此主题的详细信息,请参阅以下URL:

为什么我们需要类加载器的概念

类装入器允许我们从各种来源装入类

  • 磁盘上的jar文件
  • 运行时生成的字节数组
  • 来自互联网(这是小程序的典型用例)
这使得应用程序的启动更加灵活和模块化

给我一个例子,说明您使用类加载器的情况以及为什么在那里使用类加载器。

如果没有类加载器,您将走不远,因此我将您的问题解释为“何时需要自定义类加载器”

就我个人而言,我使用字节码操纵库()做了一些实验,在这里我用get和set方法调用替换了字段访问。我使用自定义类装入器在装入类时重写它们。我不知道这是否是一个典型的用例,但问题是,如果没有它,我不可能做到这一点


您还可以想象一个插件系统,它从某个插件目录加载外围类。

JVM按需加载类。例如,当需要显式加载类时,需要从主类引用该类

静止的{
MyClass.class.getName();
}


很少需要自定义类加载器,大多数常见情况是:AOP(例如,使用Javassist对类进行加载时检测)、远程类加载(从远程位置加载类)、加密类加载(解密类代码和加载)如果您正在开发能够支持插件的应用程序,则可以使用类加载器来加载类。 样本: 您有视频播放器的应用程序,每个编解码器都是应用程序中的插件。
你有文件夹./codecs,你把你的插件codecs放在那里。您可以在文件夹中搜索jar文件,并使用类加载器加载所有jar文件。

只要直接执行一个类,或者在要执行的另一个类中引用该类,就会加载该类。。。 比如说

class A
{}  
class B extends A  
{  
  public static void main(String arr[])  
  {}  
}  
在这里,每当您获得execute类B时,就会自动加载类A

现在考虑这个

class A  
{}  

class B  
{  
  public static void main(String arr[])  
  {  
    A ob=new A();//here class A is need to be loaded by JRE  
  }  
}

JVM在类第一次被引用时加载它。要深入分析类加载器,请查看许多情况下使用的类加载器。例如:

  • Class.forName在运行时获取Java类
  • 反射API
  • Eclipse调试器

  • 还有很多其他示例。

    默认类加载器只加载一次.Class文件,即使您在程序中使用了多次。加载.class文件后,如果在外部修改,则默认类加载器不会加载类文件的更新版本(.class文件已在方法区域中可用)。您可以通过定义自己的自定义类加载器来解决此问题。

    定制类装入器的主要优点是您可以根据自己的需求控制类装入机制

    java.lang.ClassLoader
    定义自己的自定义类加载器。JAVA中的每个类加载器都应该是JAVA.lang.ClassLoader类的子类,可以是直接的,也可以是间接的。因此,该类充当所有自定义类装入器的基类

    注意:在设计/开发web服务器和应用服务器时,通常使用自定义类装入器来定制类装入机制

    例如:

    public class CustClassLoader extends ClassLoader{
         public Class loadClass(String cname) throws ClassNotFoundException{
         //check for updates and laod updated .class
         //file and returns corresponding Class
         }
    }
    
    class Client{
        public static void main(String [] args){
             Dog d1 = new Dog();
             CustClassLoader c1 = new CustClassLoader();
             c1.loadClass("Dog");
             //
             // 
             //
             c1.loadClass("Dog");
             //
         //
         }
    }
    

    也许可以学习一般的课堂加载器,并提出具体的问题。问“请解释你所知道的关于类加载器的一切”有点过分了。类装入器/类装入是一个巨大的主题。类加载器本身就是一个类,类加载器可以用不同的策略分层排列;self-first、parent-first和Thread-Context类加载器——这是一个令人困惑的大主题,但幸运的是,有很多来源都有很好的文档记录,可以通过谷歌搜索并准备阅读大量内容。
    动态类加载
    可以是一个很好的例子,其中我们使用class.forName(String clazz)方法将类动态加载到容器中…为什么说没有类加载器就走不了多远?例如,在阅读关于CRUD和JavaEE的书籍时,他们从不谈论Java的这种使用。你什么时候知道是时候用这种方式使用类加载器了?@KurtMiller,我说“没有类加载器你走不了多远”,因为如果你的类不加载,你就走不了多远。加载类是在类中执行代码的先决条件。即使是一个简单的helloworld程序也需要一个类加载器。
    public class CustClassLoader extends ClassLoader{
         public Class loadClass(String cname) throws ClassNotFoundException{
         //check for updates and laod updated .class
         //file and returns corresponding Class
         }
    }
    
    class Client{
        public static void main(String [] args){
             Dog d1 = new Dog();
             CustClassLoader c1 = new CustClassLoader();
             c1.loadClass("Dog");
             //
             // 
             //
             c1.loadClass("Dog");
             //
         //
         }
    }