Java 何时使用静态和动态类加载?

Java 何时使用静态和动态类加载?,java,class,Java,Class,我知道静态类加载和动态类加载之间的区别。 一般来说,我们总是只使用静态类加载。当您使用反射和创建新实例时,谁知道在哪些情况下我们使用动态类加载??。您总是可以通过url获取新的jar,并在运行时从中创建对象。一个常见的例子是琐碎的JDBC编程。动态类加载用于加载驱动程序类 如果您看到任何带有Class.forName()的代码,那么这就是动态加载的示例。一般来说,当您的程序使用编译时不一定可用的类时。例如插件系统,您可以在不重新编译原始应用程序的情况下创建新插件。Java中最常见的情况是插件和类

我知道静态类加载和动态类加载之间的区别。
一般来说,我们总是只使用静态类加载。当您使用反射和创建新实例时,谁知道在哪些情况下我们使用动态类加载??

。您总是可以通过url获取新的jar,并在运行时从中创建对象。

一个常见的例子是琐碎的JDBC编程。动态类加载用于加载驱动程序类


如果您看到任何带有Class.forName()的代码,那么这就是动态加载的示例。一般来说,当您的程序使用编译时不一定可用的类时。例如插件系统,您可以在不重新编译原始应用程序的情况下创建新插件。

Java中最常见的情况是插件和类似插件的库,如JDBC驱动程序。

动态类加载 它允许您构建应用程序,以便关键的外部依赖项不会编译到应用程序源代码中

应用 JDBC 例如,在JDBC案例中,它允许您在不同的驱动程序实现和(理论上)不同的数据库供应商之间切换,而无需更改源代码

插件 另一个用例是,一些供应商开发了一种通用形式的应用程序,该应用程序具有扩展点,允许客户“插入”他们自己的自定义类。自定义类通常使用Class.forName(…)加载

框架和容器 第三个用例是应用程序框架和容器,它们通常在后台使用Class.forName(…)来动态加载特定于应用程序的bean、servlet等的类

其他 第四个用例是应用程序(或者更可能是应用程序库)具有典型应用程序运行中未使用的模块。通过在内部使用Class.forName(…),应用程序或库可以避免加载和初始化大量不需要的类所带来的CPU和内存开销。(Sun Swing库显然这样做是为了减少应用程序启动时间,我相信还有其他例子。)


请参阅动态类加载允许加载程序启动前未知的java代码。Java模型根据需要加载类,在加载和运行任何一个类之前,不需要知道集合中所有类的名称

例如: 根据用户输入,您只需要创建一个对象,并且有数百个类。 这样就不需要加载所有类。您可以通过动态类加载在运行时创建对象

代码:


动态加载是一种在运行时以编程方式调用类加载器函数的技术。让我们看看如何使用Class.forName(String className)动态加载类;方法,这是一种静态方法

上面的静态方法返回与类名关联的类对象。字符串类名可以在运行时动态提供。动态加载类后,class.newInstance()方法返回所加载类的实例。这就像创建一个没有参数的类对象一样


当应用程序试图通过其类名加载类,但找不到具有指定名称的类的定义时,将引发ClassNotFoundException。以下是动态类加载的示例:

import java.util.Scanner;
接口IRobot{
void start();
}
类Robot实现IRobot{
公开作废开始(){
System.out.println(“启动机器人…”);
}
}
公共课你好{
公共静态void main(字符串[]args){
ClassLoader=Hello.class.getClassLoader();
试一试{
扫描仪=新的扫描仪(System.in);
System.out.print(“输入要加载的类名:”);
String className=scanner.nextLine();
//动态加载该类。
Class cls=loader.loadClass(类名);
IRobot obj=(IRobot)cls.newInstance();
obj.start();
scanner.close();
}catch(classnotfounde异常){
System.out.println(“未找到类”);
}捕获(例外情况除外){
System.out.println(例如getMessage());
System.out.println(“发生异常”);
}
}
}

插件加载系统就是一个很好的例子。在运行时加载插件的位置。使用反射,您可以动态地从外部类文件(通常打包为JAR)加载类。非常感谢您。您的回答非常有必要>“那么您不需要加载所有类”-这实际上不是动态加载所独有的,因为静态类加载只会按需进行,创建该类的第一个对象时。AFAIK动态加载主要用于工厂模式或选择性地运行类初始化代码。实际上,这就是反射机制?顺便问一下,“Java模型”是什么@尼利斯
try {
    InputStreamReader in = new InputStreamReader(System.in);
    BufferedReader reader = new BufferedReader(in);

    System.out.println("Enter Class Name: ");
    String whatClass = reader.readLine();

    Class exampleClass = Class.forName(whatClass);
    Object ob = exampleClass.newInstance();

} catch (ClassNotFoundException e) {
    e.printStackTrace();

} catch (Exception e) {
    e.printStackTrace();
}