Java导入是如何工作的?
我想知道Java导入是如何工作的?,java,Java,我想知道import语句是如何工作的 我这样问是因为我的项目中有以下imports: import static com.googlecode.javacv.jna.highgui.cvCreateCameraCapture; import static com.googlecode.javacv.jna.highgui.cvGrabFrame; import static com.googlecode.javacv.jna.highgui.cvReleaseCapture; import co
import
语句是如何工作的
我这样问是因为我的项目中有以下imports
:
import static com.googlecode.javacv.jna.highgui.cvCreateCameraCapture;
import static com.googlecode.javacv.jna.highgui.cvGrabFrame;
import static com.googlecode.javacv.jna.highgui.cvReleaseCapture;
import com.googlecode.javacv.CanvasFrame;
import com.googlecode.javacv.FrameGrabber;
import com.colorfulwolf.webcamapplet.gui.ImagePanel;
import com.googlecode.javacv.OpenCVFrameGrabber;
import com.googlecode.javacv.jna.cxcore.IplImage;
我的项目中没有这些包,因此,如何导入这些包
如果我用我所有的类创建了一个JAR文件,我的服务器将承载这个JAR文件,它必须是免费的Internet访问,才能获得这些包
我的Applet
中有一些问题,它有这些导入,我想问这个问题,以了解是否可以成为互联网规则
<applet code="com.colorfulwolf.webcamapplet.WebcamApplet"
archive="http://san.redenetimoveis.com/teste.jar, http://san.redenetimoveis.com/core.jar, http://san.redenetimoveis.com/javacv.jar, http://san.redenetimoveis.com/javase.jar, http://san.redenetimoveis.com/jna.jar, http://san.redenetimoveis.com/customizer.jar, http://san.redenetimoveis.com/jmf.jar, http://san.redenetimoveis.com/mediaplayer.jar, http://san.redenetimoveis.com/multiplayer.jar, http://san.redenetimoveis.com/sound.jar"
height="550" width="550">
</applet>
javac
(或运行时java
)查找在类路径中导入的类。如果它们不在类路径中
则抛出类未找到
异常
classpath
就像shell中的path
变量,shell使用该变量查找命令或可执行文件
整个目录或单个jar文件可以放在类路径中。此外,是的,类路径
可能包括一个非本地路径,但位于internet上的某个位置。请阅读有关类路径的更多信息以解决您的疑问。您要导入的类必须位于类路径上。因此,要么Applet的用户必须将这些库放在正确的位置,要么您只需将它们包含在jar文件中即可提供这些库。例如:Java中的导入根本不起作用,因为它只在编译时进行计算。
(将其视为快捷方式,这样就不必编写完全限定的类名)。在运行时根本没有导入,只有FQCN
在运行时,类加载器必须能够找到您引用的所有类。(classloader基础设施有时很神奇,高度依赖于环境。)对于小程序,您必须正确地装配HTML标记,并在服务器上提供必要的JAR存档
PS:运行时的匹配是通过限定的类名完成的-在该名称下找到的类不一定与您编译所针对的类相同或兼容。在动态语言中,当解释器导入时,它只读取一个文件并对其求值
在C语言中,外部库在编译时由链接器定位,如果库是静态编译的,则构建最终对象;而对于动态库,则在运行时调用较小版本的链接器,该链接器会重新映射地址,从而使库中的代码可供可执行文件使用
在Java中,import
被编译器简单地用来让您根据类的非限定名称命名类,比如说String
,而不是Java.lang.String
。您实际上不需要导入java.lang.*
,因为编译器在默认情况下会这样做。然而,这种机制只是为了节省一些输入。Java中的类型是完全限定的类名,因此当代码运行时,String
实际上是Java.lang.String
对象。包旨在防止名称冲突,并允许两个类具有相同的简单名称,而不是依赖于像这样的前缀类型的旧C约定<代码>java语言字符串
。这称为名称空间
顺便说一句,在Java中有静态导入结构,如果使用某个类中的大量常量,它允许进一步保存键入。在编译单元(一个.java文件)中
import static java.lang.Math.*;
您可以在代码中使用常量PI
,而不是通过Math.PI
引用它,也可以使用方法cos()
而不是Math.cos()
。比如你可以写
double r = cos(PI * theta);
一旦理解了类总是在最终字节码中由它们的完全限定名引用,就必须理解类代码实际上是如何加载的。这发生在第一次创建该类的对象时,或者第一次访问该类的静态成员时。此时,ClassLoader
尝试定位类并实例化它。如果找不到类,将抛出一个NoClassDefFoundError
(或者如果以编程方式搜索该类,则抛出一个ClassNotFoundException
)。要定位该类,ClassLoader
通常检查$CLASSPATH
环境变量中列出的路径
要解决您的问题,您需要这样一个applet
元素
<applet
codebase = "http://san.redenetimoveis.com"
archive="test.jar, core.jar"
code="com.colorfulwolf.webcamapplet.WebcamApplet"
width="550" height="550" >
顺便说一句,您不需要在标准JRE中导入归档文件。Java的import语句是纯语法的。仅在编译时对import求值,以指示编译器在代码中查找名称的位置
如果始终指定类的完整限定名,则可能没有任何导入语句。像这行一样,根本不需要导入语句:
javax.swing.JButton but = new javax.swing.JButton();
import语句将使代码更具可读性,如下所示:
import javax.swing.*;
JButton but = new JButton();
我读了这个线程,但线程没有回答我的问题。发生了什么,我的小程序停在一行,我调用了import static com.googlecode.javacv.jna.highgui.cvCreateCameraCapture中存在的方法代码>。但是localhost
工作正常,我在服务器中热处理jar
文件时遇到了这个问题。因此,如果applet
停止在调用此导入包中存在的方法的行中,可能internet访问规则可以解决此问题?发布对象标记和目录结构。通常小程序可以访问它们来自的服务器,并且在我的导入中调用外部包时,比如google(查看我的导入)。会怎么做?我需要免费上网?看来你的档案必须放在codebase
指向的同一个位置,并用简单的名称myjar.jar
和foobar.jar
引用。请参见我尝试将放在哪里定义了$CLASSPATH?我能换一下吗?做