什么';java中编译时库和运行时库的区别是什么?

什么';java中编译时库和运行时库的区别是什么?,java,netbeans,Java,Netbeans,专业人士使用这两种方法的缺点是什么 实际上,我在Netbeans的Project Properties>Libraries for Java应用程序下看到了它。我们有两个选项卡,一个用于编译时库,另一个用于运行时库,看起来我们可以将库添加到彼此独立的库中 也许你混淆了一些概念 在Java中,要使用的库在编译时进行静态验证,也在运行时进行验证 例如,如果要使用库中指定的IterableMap。编译器在“编译时”验证您正在调用该类中存在的方法 但是编译器不会链接或使用该库做很多事情,您在运行时仍然需

专业人士使用这两种方法的缺点是什么


实际上,我在Netbeans的Project Properties>Libraries for Java应用程序下看到了它。我们有两个选项卡,一个用于编译时库,另一个用于运行时库,看起来我们可以将库添加到彼此独立的库中

也许你混淆了一些概念

在Java中,要使用的库在编译时进行静态验证,也在运行时进行验证

例如,如果要使用库中指定的
IterableMap
。编译器在“编译时”验证您正在调用该类中存在的方法

但是编译器不会链接或使用该库做很多事情,您在运行时仍然需要它。因此,当代码执行时,Java运行时会再次搜索该类,并调用编译器验证存在的方法


这就是问题所在

正如其他人所说,你混淆了概念。我想你真正想理解的是所谓的。有时,您只需要在编译时使用依赖项,因为您希望在运行时提供它,有时您需要在运行时使用依赖项,但不需要在编译时使用依赖项。

库属性对话框的UI和术语非常混乱

该对话框上的“帮助”按钮将为您提供大量信息

编译时库列表可以是运行时库列表的子集

考虑一下这种情况

您拥有从“widgets.jar”库中导入类的源代码。widgets.jar中的类文件引用jar文件“xml.jar”中的符号。如果源代码没有从xml.jar导入类,那么可以定义编译时库列表以仅包含widgets.jar


当您尝试运行项目时,可能需要在运行时库列表中包含xml.jar,以防止ClassNotFoundException。

当您希望动态加载库,或者检查库的存在,然后执行代码时,这可能会起作用

在编译过程中,编译器需要知道方法、类等的签名,才能知道您的代码是否正确。因此,您添加了编译时库

在运行时,JVM仍然需要库来运行特定的代码。但是您可以通过检查库是否存在,例如通过执行
Class.for()
method,来设置一个逻辑来避免该代码。有些库可能已经存在于系统中(例如qt.jar),也可能不存在,您可以相应地检查和执行代码


如果我错了,请纠正我。

谁告诉你在java中有这样的选择?也许你对compiletime和runtime类路径之间的区别感到困惑?@Nikita/akf我实际上在Netbeans的Project Properties>Libraries for java Applications下看到了它。我们有两个选项卡,一个用于编译时库,另一个用于运行时库。看起来我们可以将一个库添加到彼此独立的库中。看起来人们错过了这个问题的NetBeans。感谢您提供的信息。但是什么是abt反射呢?如果我们尝试使用使用反射的类,编译器不会抱怨,对吗?类似于@bdhar-reflection的东西只是一种不同的方式,它将验证移动到比类加载更晚的时间。编译器对以这种方式调用的方法的类型一无所知,但是运行时系统(特别是反射API)确保没有不安全的情况发生。谢谢@阿尔卑斯山:有时。在关于StackOverflow的评论中嵌入一个问题实际上违背了StackOverflow的目的。习惯于提问可能会得到更多回答者的更好回答。