63

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 ファイルをホストするサーバーは、これらを取得するためにインターネットに無料でアクセスできる必要がありますpackageか?

これらのインポートがある問題が発生しました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>
4

5 に答える 5

95

動的言語では、インタプリタがimportsを実行すると、ファイルを読み取って評価するだけです。

Cでは、ライブラリが静的にコンパイルされている場合、外部ライブラリはコンパイル時にリンカーによって配置され、最終オブジェクトをビルドします。動的ライブラリの場合、実行時に小さなバージョンのリンカーが呼び出され、アドレスが再マップされるため、ライブラリ内のコードが使用可能になります。実行可能ファイルに。

Javaではimport、コンパイラが単にクラスに非修飾名で名前を付けるために使用します。たとえば、のString代わりに使用しjava.lang.Stringます。java.lang.*コンパイラがデフォルトでインポートするため、実際にインポートする必要はありません。ただし、このメカニズムは、タイピングを節約するためのものです。Javaの型は完全修飾クラス名であるため、コードが実行されるとき、 aStringは実際にはオブジェクトです。java.lang.Stringパッケージは、名前の衝突を防ぎ、このようなプレフィックスタイプの古いC規則に依存するのではなく、 2つのクラスが同じ単純な名前を持つことを可能にすることを目的としています。。これは名前空間と呼ばれます。java_lang_String

ところで、Javaには静的インポート構造があります。これにより、特定のクラスの定数を多数使用する場合に、入力をさらに節約できます。宣言するコンパイルユニット(.javaファイル)内

import static java.lang.Math.*;

PIコードで定数を参照する代わりに定数を使用し、 。の代わりにMath.PIメソッドを使用できます。たとえば、次のように書くことができますcos()Math.cos()

double r = cos(PI * theta);

クラスが常に最終バイトコードで完全修飾名によって参照されることを理解したら、クラスコードが実際にどのようにロードされるかを理解する必要があります。これは、そのクラスのオブジェクトが初めて作成されたとき、またはクラスの静的メンバーに初めてアクセスされたときに発生します。このとき、ClassLoaderはクラスを見つけてインスタンス化しようとします。クラスが見つからない場合はNoClassDefFoundErroraがスローされます(ClassNotFoundExceptionクラスがプログラムで検索されている場合はaa)。クラスを見つけるために、通常、環境変数ClassLoaderにリストされているパスをチェックします。$CLASSPATH

あなたの問題を解決するには、このような要素が必要なようですapplet

<applet
  codebase = "http://san.redenetimoveis.com"
  archive="test.jar, core.jar"
  code="com.colorfulwolf.webcamapplet.WebcamApplet"      
  width="550" height="550" >

ところで、標準のJREにアーカイブをインポートする必要はありません。

于 2012-09-27T11:53:05.070 に答える
35

Java のimportステートメントは、純粋な構文糖衣です。importはコンパイル時にのみ評価され、コード内の名前の場所をコンパイラーに示します。

常にクラスの完全修飾名を指定すると、import ステートメントがなくても問題はありません。この行のように、インポートステートメントはまったく必要ありません:

javax.swing.JButton but = new  javax.swing.JButton();

import ステートメントは、次のようにコードを読みやすくします。

import javax.swing.*;

JButton but = new JButton();
于 2012-09-27T12:08:10.770 に答える
3

Java でのインポートは、コンパイル時にのみ評価されるため、まったく機能しません。(完全修飾クラス名を記述する必要がないように、ショートカットとして扱います)。実行時にはインポートはまったくなく、FQCN のみです。

実行時に、参照したすべてのクラスがクラスローダーによって検出される必要があります。(クラスローダ インフラストラクチャは、場合によっては暗黒の魔法であり、環境に大きく依存します。) アプレットの場合、HTML タグを適切に設定し、必要な JAR アーカイブをサーバーに提供する必要があります。

PS: 実行時のマッチングは、修飾されたクラス名によって行われます。この名前で見つかったクラスは、コンパイルしたクラスと必ずしも同じまたは互換性があるとは限りません。

于 2012-09-27T11:43:19.827 に答える
1

javac(またはjava実行時に)classesでインポートされているを探しますclasspath。それらが存在しない場合、classpath例外classnotfoundがスローされます。

classpathpathこれは、シェルがコマンドまたは実行可能ファイルを検索するために使用する、シェルの変数に似ています。

ディレクトリ全体または個々の jar ファイルをclasspath. また、はい、classpathおそらくローカルではなく、インターネット上のどこかにあるパスを含めることができます。疑問を解決するには、クラスパスの詳細をお読みください。

于 2012-09-27T11:40:20.093 に答える
0

インポートするクラスは、クラスパス上にある必要があります。したがって、アプレットのユーザーが適切な場所にライブラリを配置する必要があるか、単にそれらのライブラリを jar ファイルに含めて提供する必要があります。たとえば、次のようになります:リリースを 1 つの JAR ファイルにマージする最も簡単な方法

于 2012-09-27T11:40:44.553 に答える