我知道静态类加载和动态类加载之间的区别。一般来说,我们总是只使用静态类加载。谁能告诉我们在哪些情况下使用动态类加载?
8 回答
动态类加载允许加载在程序启动之前未知的 java 代码。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();
}
动态类加载
它允许您构建应用程序,以便关键的外部依赖项不会编译到应用程序源代码中。
应用
JDBC
例如,在 JDBC 案例中,它允许您在不同的驱动程序实现和(理论上)不同的数据库供应商之间切换,而无需更改源代码。
插件
另一个用例是当一些供应商开发具有扩展点的通用形式的应用程序时,允许客户“插入”他们自己的自定义类。自定义类通常使用 Class.forName(...) 加载。
框架和容器
第三个用例是应用程序框架和容器,它们通常在后台使用 Class.forName(...) 来动态加载特定于应用程序的 bean、servlet 等的类。
其他
第四个用例是应用程序(或更可能是应用程序库)具有在典型应用程序运行中未使用的模块。通过在内部使用 Class.forName(...),应用程序或库可以避免加载和初始化大量不需要的类的 CPU 和内存开销。(Sun Swing 库显然这样做是为了减少应用程序的启动时间,我相信还有其他示例。)
参考动态类加载
一个常见的例子是简单的 JDBC 编程。动态类加载用于加载驱动类
如果您看到任何带有 Class.forName() 的代码,那么这就是动态加载的示例
一般来说,只要您的程序将使用在编译时不一定可用的类。一个示例是插件系统,您可以在其中创建新插件而无需重新编译原始应用程序。
当您使用反射并创建新实例时。您可以随时获取新的 jar,例如。通过 url 并在运行时从中创建对象。
Java 中最常见的情况是插件和类似于 JDBC 驱动程序之类的库的插件。
动态加载是一种在运行时以编程方式调用类加载器功能的技术。让我们看看如何使用 Class.forName(String className); 动态加载类。方法,它是一个静态方法。
上述静态方法返回与类名关联的类对象。字符串 className 可以在运行时动态提供。一旦类被动态加载,class.newInstance() 方法将返回加载类的实例。这就像创建一个没有参数的类对象。
当应用程序尝试通过其类名加载类时,将引发 ClassNotFoundException,但找不到具有指定名称的类的定义。
这是动态类加载的示例:
import java.util.Scanner;
interface IRobot{
void start();
}
class Robot implements IRobot{
public void start(){
System.out.println("Starting robot...");
}
}
public class Hello{
public static void main(String[] args){
ClassLoader loader = Hello.class.getClassLoader();
try {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter class name to load: ");
String className = scanner.nextLine();
// Load the class dynamically.
Class cls = loader.loadClass(className);
IRobot obj =(IRobot) cls.newInstance();
obj.start();
scanner.close();
} catch (ClassNotFoundException e) {
System.out.println("Class not found");
} catch (Exception ex){
System.out.println(ex.getMessage());
System.out.println("Exception occured.");
}
}
}