Java类加载器的目的是什么?

时间:2011-06-29 10:15:10

标签: java classloader

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

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

7 个答案:

答案 0 :(得分:13)

  

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

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

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

  

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

类加载器允许我们从各种来源加载类。

  • 磁盘上的jar文件
  • 运行时生成的字节数组
  • 来自互联网(这是小程序的典型用例)

这使得应用程序的启动更加灵活和模块化。

  

给我举个例子,说明你使用类加载器以及为何在那里使用类加载器。

如果没有类加载器,你就不会走得太远,所以我将你的问题解释为"你什么时候需要自定义类加载器"。

我个人使用字节码操作库(ASM)进行了一些实验,其中我用get-和set-method调用替换了字段访问。我使用自定义类加载器在加载类时重写它们。我不知道它是否是一个典型的用例,但问题是如果没有一个用户我就无法做到这一点!

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

答案 1 :(得分:2)

只要直接执行一个类,或者在另一个要执行的类中引用它,它就会被加载... 例如

class A
{}  
class B extends A  
{  
  public static void main(String arr[])  
  {}  
}  

这里只要你执行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  
  }  
}

答案 2 :(得分:1)

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

static {
    MyClass.class.getName();
}

很少需要自定义类加载器,大多数公共案例是:AOP(例如,使用Javassist的类的运行时加载检测),远程类加载(从远程位置加载类),加密类加载(解密类代码和加载) )。

答案 3 :(得分:1)

如果您正在开发可以支持插件的应用程序,则使用类Loader来加载类。 样品: 您有视频播放器应用程序,每个编解码器都是您的应用程序中的插件。 你有文件夹./codecs,你有你的插件编解码器。您在文件夹中搜索jar文件,并使用类加载器加载所有jar文件。

答案 4 :(得分:1)

JVM在第一次引用时加载一个Class。有关类加载器的深入分析,请查看here

答案 5 :(得分:0)

在许多情况下使用类加载器。几个例子是:

  1. Class.forName在运行时获取Java类
  2. Reflection API
  3. Eclipse调试器
  4. 还有很多其他例子。

答案 6 :(得分:0)

默认类加载器只会加载.class文件一次,即使您在程序中多次使用它。在load.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");
         //
     //
     }
}
相关问题