JavaでAPIのI/Fはどう認識してるのか?

このQ&Aのポイント
  • JavaでのAPIのインタフェース認識方法とは? 具体的には、jar提供の場合の認識方法についても考える。
  • Javaでは、他のクラスやAPIのインタフェースを認識するために、クラスファイルが提供されている場合はclasspathを設定することで認識できる。
  • C言語の「ヘッダファイルをincludeすること」と「リンクの画面で、.libを指定すること」の意味の違いについて知りたい。それぞれが必要な理由を知りたい。
回答を見る
  • ベストアンサー

JavaでAPIのI/Fはどう認識してるのか?

例えば、C言語だと、 リンクの画面で、.lib を指定したり、 使いたいクラスのヘッダファイルをincludeすることで、 自分が作っているプログラムが、「他のクラスを使える」という状況になると思っています。 で、JAVAでは、 どのような仕組みで、他のクラスや、APIのI/Fを認識しているのでしょうか? 特に、色んなアドオン?API? は、jar提供が多いと思うのですが、 クラスファイルすらないと、I/Fを認識しようにも、認識できないのでは?と感じています。 また、以下の認識は正しいでしょうか? クラスファイルが提供されている場合は、classpathを設定すると、 そのディレクトリ配下のクラスのインタフェースを認識できる。 ※また、できれば、C言語での 「ヘッダファイルをincludeすること」と「リンクの画面で、.lib を指定すること」の意味の違いを知りたいです。 どちらも、「他のクラスのインタフェースを認識するためにすること」であるのに、 どうしてそれぞれが必要なのでしょうか?? .

  • Java
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.2

JAVAではコンパイル後のクラスファイル(*.class)がCで言うところのヘッダファイル(*.h)とライブラリ(*.oとか*.aとか)が一緒になったものと言ったら分かりやすいだろうか。 C言語ではヘッダファイルの中にソースレベルで関数の定義が入ってて、includeして同じソースコードとしてコンパイルするからコンパイルができる。そしてコンパイルした後の中間ファイルとライブラリをリンクして*.exeとかa.outとかすなわち実際に実行できるプログラムファイルが出来上がる。これを読んで「え? じゃあヘッダーに書かれてる関数定義とライブラリに入ってる関数の実体の型とか引数が違ったらやばいじゃん」と思ったあなたはするどい。 というわけでJavaではこのヘッダファイルに当たる情報とライブラリに当たる情報が一つのファイルにまとまってて関数定義と関数の実体に不整合がおきっこないようになっている。だから一つのclassファイルだけでソースを書いている側が定義も分かるし呼び出すこともできるってわけだ。 で、JARファイルとは何かっつーとJava ARchiveの略でJavaプラットフォームで使われる圧縮ファイルで、その実体はほぼZIPというか圧縮アルゴリズムにZIPとほぼ同じものを利用しているので7-ZipとかWindows標準の圧縮フォルダーとかで中を覗く事ができる。中を見ると分かるがclassファイルとかいくつかのテキストファイルがあり、画像とか別の任意のファイルがあっても良い。 話をまとめると、 ・jarの中身にはclassファイルが入っている ・classファイルはCで言うヘッダとライブラリが両方合わさったもの なのでJavaは関数定義も読めるし関数を実際に呼び出すこともできるのだ。

paranoia23
質問者

お礼

ありがとうございます! とてもわかりやすかったです!

その他の回答 (1)

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.1

>特に、色んなアドオン?API? は、jar提供が多いと思うのですが、 >クラスファイルすらないと、I/Fを認識しようにも、認識できないのでは?と感じています。 適当なjarファイルをコピーして拡張子をjarからzipに変えて展開してみてください。 >※また、できれば、C言語での >「ヘッダファイルをincludeすること」と「リンクの画面で、.lib を指定すること」の意味の違いを知りたいです。 ヘッダファイルには何が書いてあるか見てみたことありますか? 基本的には型が~な変数~や型が~で引数が~関数~があるという事が書いてあるだけです。 実体はlibの方にあります。

paranoia23
質問者

お礼

回答ありがとうございます。 ヘッダファイルに書いてあることや、実体はlibであることは知っているのです。 知りたいのは、 JAVAの開発の時、作っているプログラムが、「他のクラスを使える」という状況になるのはどういうメカニズムなのか?という点です。 「Javaではどのような仕組みで、他のクラスや、APIのI/Fを認識しているのか?」 の観点で考えると、例えばヘッダとlibがあると、dll上のロード後、メモリのどこにアクセスすれば処理を行えるかなどがわかるような雰囲気だと思うのですが、Javaではどうなのでしょうか?? 例えば、jarを展開した内容が下記のとき、 META-INF/ META-INF/MANIFEST.MF com/hoga/foo.class com/hoga/bar.xml piyo.xml classファイルしかない状態で、 そのclassに対して処理をできるのか??と考えると、 なんとなくできなさそうだなぁ。と思ったのです。 ビルドするときにclassファイルさえあれば、そのクラスのメソッドを使えるものなのでしょうか? なぜ使えるのでしょうか? .

関連するQ&A

  • VB2010でのAPIの使い方を教えてください。

    お世話になります。VB初心者です。ごくごく基本的なことを教えてください。 VB2010にて、PCとUSBを介して繋がっている機器からデータのやり取りを行おうとしています。 そのためのAPIが、機器メーカから***.dllという形で提供されています。同様に、これを使ったサンプルソフトもついているのですが、VB6で作ったものなので、VB2010ではそのまま使えません。 このAPIには、USBポートのOpen/CloseやRead/Writeなどの関数があるので、これを使いたいのですが、具体的にプログラム上で、どういうふうに定義(?)すればいいのでしょうか? APIの仕様書には、「API 使用時には ***.h をインクルードして使用してください→#include “***.h”」、「リンク時には、***.lib もリンクしてください」などと書かれています。 まだ、VB2010を勉強し始めたばかりなので、こういう基本的な部分がわかっていません。 お教えいただけると助かります。よろしくお願いします。

  • VC++でwin32APIを作っているのですが・・・

    こんにちは。私はwin32APIを勉強しているc言語初心者です。 私はMicrosoft Visual C++ 2008を使ってc言語のwin32APIをプログラミングしているのですが、独学でやっているので物凄く邪道なwin32APIプログラミングをしているような気がするのです。 ・c言語のプログラムを書いて、C++のwin32APIプロジェクトとしてビルドする。 ・ヘッダーファイルにwin32API関数がなかったので、自分のwindowOSからwin32API関数を探し出してVC++2008のなかのincludeフォルダ内にコピー&ペーストして使えるようにした。 これって邪道ですか?一応何の問題もなくwin32APIプログラムが作れるのですが、もっと正規なやり方があるでしょうか。回答よろしくお願いします。

  • マルチディスプレイモニタのWin32APIについて

    いつもお世話になっております。 現在マルチモニタ環境でのダイアログボックスの表示位置の制御を試みております。 しかしVC6.0sp5(sp6も同様)の環境でマルチモニタのAPIを使用するとコンパイルは通るのですがビルドの段階で、 「sample.obj : error LNK2001: 外部シンボル "_xEnumDisplayMonitors@16"は未解決です」 というエラーが出てしまいます。 他のマルチモニタのAPIについても同様です。 自分では、 ・libファイルのインクルードの確認 ・ヴァージョンの確認 ・ヘッダファイルとlibファイルのヴァージョンの確認 ・ヘッダファイルの中身の確認 はしました。 (特に問題はなさそうなのですが・・) しかしそれでも解決できていません。 解決策はどのようなものがあるかご教授願います。 マルチモニタの環境はWindows XP sp1です。

  • F904iに音楽ファイルをいれる方法

    F904iに音楽ファイルをいれる方法を探しています。 購入時についてきたFOMA Fシリーズデータリンクソフトを使用しようと思っていたのですが PCはF904iを認識しているのにも関わらずデータリンクソフトがF904iを認識してくれません。(これの対処法も出来たらお願いします なので直接ドライブ選択から入れようと思ったのですがどこに入れればいいのか分からず… どなたか情報お寄せください。

  • F904iでのミュージック

    こんばんは。私は先日、F902iからF904iへと機種変更をしました。 そこで、データリンクソフト等でデータを全て移し変えていたのですが、ミュージックだけがF904iでは認識されず聴けませんでした。 調べた結果、富士通の解説ページを見つけましたが、WMAが・・・同期が・・・と順番に目を通してもわけがわかりません。 F902iで聞けていた拡張子「m4a」はもう聞けないのでしょうか? また、データリンクソフトではミュージックをSDカードには入れられないのでしょうか? F902iで慣れていた分、戸惑っています。 親切な方、教えてください。

  • APIをラップしたクラスの設計と開発

    APIを使用する際、APIの利用部分を1箇所に集めておくために、 ラップするクラスを作った上で、そのラッパー経由でAPIを使用するようにしています。 そのラッパークラスの設計と実装で、わからないことがあります。 下の【1】と【2】を同時に実現しようとしたら、 矛盾してできないようなのです。 【1】 ラッパークラスを作る際、   (1)インタフェースを定義するための基底クラスと、   (2)その基底クラス(インタフェース)を実装する側のクラスを作ろうとしました。 【2】 使うAPI(ミドルウェア)を切り替える可能性があったので、   ・どのようなミドルウェアでも共通に使えるようなインタフェースにしようとしました。 しかし、インタフェースを作ろうとした時点で、 インタフェースとして使われるというか、 引数として渡したり、戻り値として返して貰う「データ型」「クラス」が、 「ミドルウェア」に依存してしまうために、 「基底クラスのインタフェース」にミドルウェア固有の型が入らざるを得ないと感じました。 通常、【1】と【2】は同時には実現できないという認識で良いのでしょうか? また、【1】の基底クラスと実装クラスを分けるということだけを実現しようとするなら、  データ型xを、   #Define WrappedX ラップデータ型X;  #Define WrappedY ラップデータ型Y;  とした上で、基底クラスのインタフェースで登場する、  Inputの型とOutoutの型を、見かけ上、ラップデータ型X、ラップデータ型Y  にすることを考えていますが、  他の開発者の方はどのような方法でクラスの設計・開発をしているのでしょうか? ※引数も、戻り値も、  voidポインタにして、ダウンキャストして、、  ということもできるのかもしれませんが、  その方法はなんだか抵抗を感じますし、自分の力量では不具合があったときに対処できないため、  事実上採用できない感じです。 .

  • JAVAであるAPIの使い方

    JAVA初心者です。 あるブループウェアの連携APIを使うことになってしまったのですが、 (そのため現在JAVA入門から勉強しています) サンプルプログラムを動かすことはできました。 多分新しく作ったクラスにJARファイルを追加?することになると思い、 まず試しにJARファイルを解凍して同じファイル(ファルダ)構成で再びJARファイルを作りました。 コマンド:jar cmf garoon3api\META-INF\MANIFEST.MF garoon3api.jar garoon33api すると、サンプルプログラムは動きませんでした。 C:\java\garoon>java -cp garoon3api.jar com.cybozu.garoon3.usecase.GetUser -g log in.ini -i inG.csv -o outG.csv Exception in thread "main" java.lang.NoClassDefFoundError: com/cybozu/garoon3/us ecase/GetUser Caused by: java.lang.ClassNotFoundException: com.cybozu.garoon3.usecase.GetUser at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) Could not find the main class: com.cybozu.garoon3.usecase.GetUser. Program will exit. 何がおかしいのでしょうか? どなたか教えて下さい。 また参考となるHPとかあれば教えてください。 よろしくお願い致します。

    • ベストアンサー
    • Java
  • OpenThread

    Windows 2000でOpenThreadというAPIを使いたいのですが、ヘッダにもlibファイルにも情報がないらしく、コンパイルできません。 これに対応しているヘッダとlibファイルはどうすれば手に入るでしょうか。

  • JAVAで外部ファイルをインクルード

    JAVAの初心者です。 Cのヘッダファイルみたいに、自分で作った外部ファイルをインクルードするには import 文を使ってメインのクラスの前にいれれば良いとおもうのですが、その 認識で間違ってないでしょうか。 また、そのファイルは、あらかじめコンパイル済みである必要があるのか、読み込み側となるソースファイルと同じディレクトリにおいておけば単純にコンパイルが済むのか。 説明が伝わりにくいかと思いますが、どうかよろしくお願いします。

    • ベストアンサー
    • Java
  • C++での静的ライブラリの作成方法

    C++での静的ライブラリの作成方法 今まで独学でC++を勉強してきたのですが、既存ライブラリのラッパーを作りたいと思います そこで、色々なサイトなどで調べてみたのですが、いまいちライブラリというものについて納得の出来る解説のあるサイトが見つからなかったので、質問させて下さい まず私が元にするライブラリの構成は hoge.h foo.lib bar.lib となっており、その関数などを使用する独自型のクラスや、それをさらに扱うクラスなどを作っています その場合、ふたつのクラスをひとつのlibファイルに一緒にしてもいいものなのか、 はたまた分けてそれぞれlibファイルにするのか、 複数できたヘッダはプロジェクトに追加するときどれを入れるのか、 インクルードやリンクはどこに張ればいいのか、 libファイルにヘッダは含まれているのか、など 基本的なことが全然わからず、身近に聞ける人もいなくずっと手探り状態です よろしければ全体のファイル構成や作り方、使い方などの基本的なことから教えて下さい あと別件なのですが、クラスのインスタンスが生成されたときにメンバ変数はメモリに動的に配置されると思うのですが、メンバ関数はどうなるのでしょうか? インスタンスごとに同じく生成されるのか、宣言の時に既に一箇所に用意されていて、毎回そこに飛ぶのでしょうか? よろしくお願いします!

専門家に質問してみよう