メモリにロードされたクラスの判別方法

このQ&Aのポイント
  • Javaのプログラムで任意のクラスがメモリにロードされているかどうかを判定する方法を教えてください。
  • ClassLoaderクラスを使用すれば、任意のクラスがJavaVMのメモリ上にロードされているかどうかを判定できます。
  • 具体的な使用方法についてはわかりませんが、インターネット上にサンプルコードやチュートリアルがあるはずです。
回答を見る
  • ベストアンサー

メモリにロードされたクラスの判別方法

javaを勉強し始めてまだ1週間の入門者です。 見当違いの事を書いているかもしれませんが、その場合は指摘下さい。 条件は下記通りです。 AクラスとBクラスがある。 AクラスからBクラスを呼び出す。 AクラスとBクラスには継承関係は無い。 BクラスがjavaVMのメモリ領域にロードされるタイミングは以下のタイミングの認識で宜しいでしょうか? 1.AクラスからBクラスのstatic変数が参照されたとき 2.AクラスからBクラスをインスタンス化したとき 上記認識が正しい場合ですが、プログラム上でBクラスがjavaVMのメモリ上にロードされているかを確認する方法があるかを調べていたのですが良くわかりませんでした。 クラスAを実行させる際に、javaのverboseオプションを使用してクラスがロードされているのを確認する事はできましたが、プログラム上で判定できないかと思いました。 検索サイトで調べてみると、ClassLoaderクラスを使用すれば出来そうな感じがしたのですが、使い方が分からず行き詰ってしまいました。 上記のように任意クラスがjavaVMのメモリ上にロードされているかいないかを判別する手法があるようでしたら、サンプル等がある場所だけでも良いので教えて頂けると助かります。 以上、よろしくお願い致します。

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

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

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

> BクラスがjavaVMのメモリ領域にロードされるタイミングは以下のタイミングの認識で宜しいでしょうか? 挙げられている以外の場合でもクラスBがロードされることはあり得ます。B.classにアクセスするとか、Class.forName("B")を呼ぶとか。 > ClassLoaderクラスを使用すれば出来そうな感じがしたのですが、使い方が分からず行き詰ってしまいました。 findLoadedClass()を使おうとしたのでしょうか。このメソッドはprotectedなので、URLClassLoaderあたりを継承したクラスを自作してその中から呼ぶ必要があります。 クラスがロード済か否かを調べる目的は何でしょうか。

tanishimi
質問者

補足

回答有難うございます。 >クラスがロード済か否かを調べる目的は何でしょうか。 深い意味はないのですが、内部的にJavaVMがどんなことをやっているのかを知りたいなと思いました。 また、まだ勉強していませんがガーベッジコレクションという機能があって、自動でメモリを開放していたりしますが、実際のプログラムで(明示的に指定はできませんが)確認できれば良いなと思った次第です。 >findLoadedClass()を使おうとしたのでしょうか。 仰るとおりです。もう一つCクラスを作成しました。 ClassLoaderをextendsして、findLoadedClass()メソッドを書いて確認しようとしましたが、イマイチ分からなく今回の質問に至りました。

関連するQ&A

  • javaクラスファイルのロード

    javaの実行時にクラスファイルがロードされる思いますが、一回ロードされたらそのままメモリ上にとどまるのでしょうか

    • ベストアンサー
    • Java
  • Importしたクラスとメモリとの関係は

     こんにちは、JAVA初心者です、宜しくお願いします。  JAVAでクラスをImportしますが、これはどのような意味でしょうか。 (メイン)メモリの上に呼び出されると いうことでしょうか。  インスタンス化したクラスはメモリの上で領域を確保するとありますが、Importしたクラスはコンパイルまでは どのような状態なのでしょうか。

  • あるクラスであるかどうかを確認する方法は?

    あるクラスが特定のクラスである事を確認する方法が知りたいです。 例えば下記のようにCクラスがBクラスを継承し、BクラスがAクラスを継承していた場合。 あるメソッドでAクラスの引数を受け取ったが、これがAクラスであるかどうかを判別したいです。(BではなくかつCではない) instanceofを使用し、Cでfalse、Bでfalseと判別する方法以外でありましたらお願いします。 Aクラス ..| ..+--Bクラス ......| ......+--Cクラス

    • ベストアンサー
    • Java
  • クラスのロードが出来ない

    あまり深くJavaを知らないうちからこんなことすることが無謀なのかも しれませんが、.NETやらPHPなら個人的に簡単にコーディングできるので、 Javaでも手法として覚えたいと思っています。 やりたいことは、AというWebアプリケーション上から、別にコンパイル されたBというjarファイルをロードし、インターフェースを介して動作させる、 といったものです。 Struts2.1.8を利用してコーディングしていますが、問題になっている部分では 大して問題にならないと思われます。 public class Index {  public String execute() throws Exception {   final String PLUGINS_DIRECTORY = "/plugins/";      //jarロード   String filePath = ServletActionContext.getServletContext().     getRealPath(PLUGINS_DIRECTORY + "TestProject.jar");   String direcotryName = (     new File(filePath).getCanonicalFile().toURI()).toString();   System.out.println(direcotryName);   URL url = new URL("jar:" + direcotryName + "!/");   URLClassLoader loader = new URLClassLoader(     new URL[] {url});      //クラスの読み込み   Object abc = loader.loadClass("testpackage.TestClass");   if (abc == null) {    System.out.println("そもそもクラスを読めなかった");   }  } } こんなスクリプトがあり、以下のディレクトリ構成を考えた時 (Index.classが上記コード) webroot  --WEB-INF     --classes        --base           --Index.class        --plugin           --PluginImpl.class  --plugins     --TestProject.jar TestProject.jarにはtestpackage.TestClassが存在するのですが、 スクリプト上ではエラーになってしまいます。 例外:java.lang.reflect.InvocationTargetException 原因:java.lang.NoClassDefFoundError: plugin/PluginImpl TestClassはplugin/PluginImplを実装したものなのですが、 どうもPluginImplが見つからずTestClassがNGになってる?みたいです。 外部jarをロードしてクラスを利用する場合の正しいやり方が分からず困っています。 正しいコードをご教示下さい。

  • 同一クラスインスタンス名で別クラスのインスタンス作成方法(C++)

    下記ソース(Java)の処理をするような、C++の実装方法を教えていただきたいです。 【処理内容】 クラスBのインスタンスを保持しており、クラスBのインスタンス名と同一であるクラスAのインスタンス生成 ClassA A_Instance = (ClassA)Class.forName(B_instance.name).newInstance(); 要はクラスインスタンスの名前の求め方がわからないのです。それさえわかれば、newしてクラスポインタを返すメソッドを用意すれば何とかなると考えていますが。 ※C++のAPI一覧はどこにあるのだろうか・・・

  • クラス、インスタンス、オブジェクトの区別

    クラスが人間という種類だとしたら インスタンスが例えばAさん、Bさんという具体的な人のことで、 オブジェクトが誰でもいいけどとりあえず具体的な誰か という認識でいいでしょうか? だとしたらなんとなくイメージはできたのですが、もっとわかりやすい言葉が欲しいです。 どなたから説明してもらえませんか?

    • ベストアンサー
    • Java
  • クラスのメモリ管理でこんがらがっています

    以下の条件があります。 (1)あるメンバ関数Aが、ライブラリの関数Bを呼ぶ (2)AがBを呼ぶ前に、AはBが使うオブジェクトCを生成する (3)AはBから応答が帰ってきた後、Cを削除する (4)AはCの詳細を知らないので、前方参照を使ってCのポインタを作ってそれを引数で渡す (5)BはAから渡されたCに、いろんなデータをつめていって、最後はAにCを引数で返す (6)Bが知っているCの構造は、一つのクラスにたくさんのクラスが集約されているもの この場合、Cのメモリ管理はAが行うことになると思いますが、実際にCに集約されているたくさんのクラスを生成するのは、Bになります。BがAにCを返すときに、Bが生成したたくさんのクラスは、Bの中できちんと消滅させなければいけないのでしょうか?でもそうすると、肝心のCの中身(データ)が消えてしまうので、意味が無いようにも思えます。それとも、Bではたくさんのクラスを生成しっぱなしでもよくて、Aが最後にきちんと全部消去してしまえばよいのでしょうか?でもそれだと、AはCの構造を知らないので、きちんと消去できない気がします。 こんな感じで、こんがらがっているのですが、どなたか問題なく動作させる方法を教えて下さい。結局、「たくさんのクラス」たちは、Bで消すべきか、Aで消すべきか、どちらでも大丈夫なのか、また、「たくさんのクラス」の中では、Aで消すものも、Bで消すものもあってよいのでしょうか?(実際には、Bの中だけで使用するクラスもあるので、そういうクラスはできればBで消去したいです)

  • 内部クラス?のエラー

    内部クラス?のエラー  今晩は、JAVA初心者です、宜しくお願い致します。  下のようなプログラムを書いてやりました。  <A>のように全体のプログラムを1つのクラスの中に別のクラスを入れる(内部クラス?)と、 「アクセス可能な型Testのエンクロージング・インスタンスがありません。  型Testのエンクロージング・インスタンスで割り振りを限定する必要があります。  (例えばx.new A()でxはテストのインスタンス)」というエラーがでます。  しかし、<B>のように別のクラスにすると、エラーは出ません。  この原因がよくわかりません。 ==================================================================== <A> public class Test { public static void main(String args[]) { Calc ca = new Calc(); ca.calcTest(1,2); } class Calc { void calcTest(int a , int b ) { int c = a + b ; System.out.print("a + b = " + c); } } } ==================================================================== <B> public class Test { public static void main(String args[]) { Calc ca = new Calc(); ca.calcTest(1,2); } } class Calc { void calcTest(int a , int b ) { int c = a + b ; System.out.print("a + b = " + c); } } ====================================================================

    • ベストアンサー
    • Java
  • Dimensionクラスの使い方

    Javaを始めたばかりの者です。 参考書を読みながら進めていて下記のソースコードで Dimensionクラスを使用している箇所で行き詰まりました。 使われていたのは、以下のコード --------------------------------------------------------------------------------------------------------------------- import java.awt.*; import javax.swing.*; import java.util.*; class xxx{  static public void main(String[] argv){  /*標準入力からmsgに文字列を入力*/  String msg = scan.next();  /*JLabelクラス型のオブジェクト型変数を作成し、インスタンスを生成*/  JLabel label = new JLabel(msg);  /*JLabelのインスタンスのコンストラクタに入力されたmsgのサイズを取得*/  Dimension dim = label.getPreferredSize();  ・・・etc  } } ---------------------------------------------------------------------------------------------------------------------- 自分が今まで使ってきたクラスは下記のような感じで使っていましたが、ここではnewしていない。 これは、どういうことなんでしょうか? クラス名 dim = new クラス名(); インスタンス作成 = コンストラクタの呼び出し。 new演算子はクラスのコンストラクタを呼び出している理解ですが Dimension dim = label.getPreferredSize(); 上記のコードではDimentionクラスのインスタンスは作られていないということだと思います。 ということは、 ここでは何をしているのでしょうか? どなたか、教えて下さい。

    • ベストアンサー
    • Java
  • インタフェース、クラスの継承、コンストラクタ意味

    Javaを学習している初心者です。 インタフェース、コンストラクタ、クラスの継承について、 必要な理由が、イマイチよく分かりません。 特に設定しなくても、プログラムは動くと思うのですが・・・ (特にインタフェース) 詳しい方、教えて下さい。

    • ベストアンサー
    • Java