我知道静态类加载和动态类加载之间的区别。 一般来说,我们总是只使用静态类加载。任何人都可以告诉我们在哪种情况下使用动态类加载??
答案 0 :(得分:21)
动态类加载允许加载程序启动前未知的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();
}
答案 1 :(得分:9)
它允许您构建应用程序,以便不将关键外部依赖项编译到应用程序源代码中。
例如,在JDBC的情况下,它允许您在不改变源代码的情况下在不同的驱动程序实现和(理论上)不同的数据库供应商之间切换。
另一个用例是当某个供应商开发一个具有扩展点的应用程序的通用形式,允许客户“插入”他们自己的自定义类。通常使用Class.forName(...)加载自定义类。
第三个用例是应用程序框架和容器,它们通常使用Class.forName(...)来动态加载特定于应用程序的bean,servlet等的类。
第四个用例是应用程序(或更可能是应用程序库)具有未在典型应用程序运行中使用的模块。通过在内部使用Class.forName(...),应用程序或库可以避免加载和初始化大量不需要的类的CPU和内存开销。 (Sun Swing库显然是为了减少应用程序启动时间,我确信还有其他示例。)
答案 2 :(得分:3)
一个常见的例子是简单的JDBC编程。动态类加载用于加载驱动程序类
如果您看到任何带有Class.forName()的代码,那么这就是动态加载的示例
答案 3 :(得分:1)
使用反射并创建新实例时。你总是可以拿到新的jar例如。通过url并在运行时从它创建对象。
答案 4 :(得分:1)
一般来说,只要您的程序使用在编译时不一定可用的类。一个例子是插件系统,您可以在其中创建新插件而无需重新编译原始应用程序。
答案 5 :(得分:1)
Java中最常见的情况是插件和插件,如JDBC驱动程序等库。
答案 6 :(得分:0)
动态加载是一种在运行时以编程方式调用类加载器的函数的技术。让我们看看如何使用Class.forName(String className)动态加载类;方法,它是一种静态方法。
上面的静态方法返回与类名关联的类对象。字符串className可以在运行时动态提供。动态加载类后,class.newInstance()方法返回已加载类的实例。这就像创建一个没有参数的类对象一样。
当应用程序尝试通过其类名加载类时抛出ClassNotFoundException,但是找不到具有指定名称的类的定义。
答案 7 :(得分:0)
这是动态类加载的示例:
public static void main(String[] args) {
final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
myTask();
}
}, 0, 1, TimeUnit.SECONDS);
}
private static void myTask() {
System.out.println("Running");
}