6


0

Javaクラスローダーの目的は何ですか?

私の質問は、JVMがプロジェクトのすべてのクラスをいつロードするかということです。 また、なぜクラスローダーの概念が必要なのでしょう。

クラスローダーを使用する状況と、その状況でクラスローダーを使用する理由の例を教えていただければ幸いです。

7 Answer


13


_ * JVMがプロジェクト内のすべてのクラスを読み込むのはいつですか。* _

JVMは、ほぼ「オンデマンド」でクラスをロードします。 I.e. 通常、ランタイムのすべてのクラスは起動時にロードされません。

このトピックの詳細については、次のURLを参照してください。

_ クラスローダーの概念が必要な理由 _

クラスローダーを使用すると、さまざまなソースからクラスをロードできます。

  • ディスク上のjarファイル

  • ランタイム生成バイト配列

  • インターネットから(これはアプレットの典型的な使用例です)

これにより、アプリケーションの起動がより柔軟でモジュール式になります。

_ クラスローダーを使用する状況と、そこでクラスローダーを使用する理由の例を示します。 _

クラスローダーがなければ、あなたは遠くに行けないので、私はあなたの質問を「いつ_custom_クラスローダーが必要になるのか」と解釈します。

個人的には、バイトコード操作ライブラリ(http://asm.ow2.org/[ASM])を使用していくつかの実験を行い、フィールドアクセスをgetメソッドおよびsetメソッドの呼び出しに置き換えました。 カスタムクラスローダーを使用して、ロードされたクラスを書き換えました。 それが典型的なユースケースであるかどうかはわかりませんが、ポイントは、これなしではこれを行えなかったということです!

プラグインディレクトリから周辺クラスをロードするプラグインシステムを想像することもできます。


2


クラスは、直接実行されるとき、または実行される別のクラスで参照される場合にロードされます…​ 例えば

class A
{}
class B extends A
{
  public static void main(String arr[])
  {}
}

ここで、クラスBを実行すると、クラスAが自動的にロードされます

今これを検討してください

class A
{}

class B
{
  public static void main(String arr[])
  {
    A ob=new A();//here class A is need to be loaded by JRE
  }
}


1


オンデマンドのJVMロードクラス。 クラスを明示的にロードする必要がある場合、メインクラスからそのクラスへの参照を作成する必要があります。たとえば、

static {
    MyClass.class.getName();
}

カスタムクラスローダーが必要になることはめったにありませんが、ほとんどの一般的なケースは次のとおりです:AOP(たとえば、Javassistを使用したクラスのランタイムオンロードインスツルメンテーション)、リモートクラスのロード(リモートロケーションからのクラスのロード)、暗号化されたクラスのロード(クラスコードの解読とロード)


1


プラグインをサポートできるアプリケーションを開発している場合は、クラスのロードにクラスローダーを使用します。 サンプル:ビデオプレーヤー用のアプリケーションがあり、各コーデックはアプリケーションのプラグインです。 フォルダー./codecsがあり、そこにプラグインコーデックを配置します。 フォルダーでjarファイルを検索し、クラスローダーですべてのjarファイルをロードします。


1


JVMは、初めて参照されるときにクラスをロードします。 クラスローダーの詳細な分析については、http://bitshub.blogspot.com/2010/01/java-classloader.html [こちら]をご覧ください。


0


多くの場合、クラスローダーが使用されます。 いくつかの例は次のとおりです。

  1. 実行時にJavaクラスを取得するClass.forName

  2. Reflection API

  3. Eclipseデバッガー

他にも多くの例があります。


0


プログラムで複数回使用している場合でも、デフォルトクラスローダーは.classファイルを1回だけロードします。 loading.classファイルが外部で変更された場合、デフォルトのクラスローダーは更新されたバージョンのクラスファイルをロードしません(.classファイルはメソッド領域で既に利用可能です)。 独自の*カスタマイズされたクラスローダー*を定義することにより、この問題を解決できます。

カスタマイズされたクラスローダーの主な利点は、要件に基づいてクラスローディングメカニズムを制御できることです。

独自のカスタマイズされたクラスローダーを定義するための「java.lang.ClassLoader」。 JAVAのすべてのクラスローダーは、直接的または間接的にjava.lang.ClassLoaderクラスの子クラスである必要があります。 したがって、このクラスは、カスタマイズされたすべてのクラスローダーの基本クラスとして機能します。

注意: Webサーバーとアプリケーションサーバーの設計/開発中、通常、カスタマイズされたクラスローダーはカスタマイズされたクラスローディングメカニズムに使用されます。

例えば:

public class CustClassLoader extends ClassLoader{
     public Class loadClass(String cname) throws ClassNotFoundException{
     //check for updates and laod updated .class
     //file and returns corresponding Class
     }
}

class Client{
    public static void main(String [] args){
         Dog d1 = new Dog();
         CustClassLoader c1 = new CustClassLoader();
         c1.loadClass("Dog");
         //
         //
         //
         c1.loadClass("Dog");
         //
     //
     }
}