国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ Java &#&ベース JavaクラスローダClassLoaderの詳細(xì)説明

JavaクラスローダClassLoaderの詳細(xì)説明

Nov 27, 2019 pm 03:35 PM
classloader クラスローダー

JavaクラスローダClassLoaderの詳細(xì)説明

ClassLoader の取得方法

1. 現(xiàn)在のクラスの ClassLoader を取得します

clazz.getClassLoader()

2. 現(xiàn)在のスレッド コンテキストの ClassLoader を取得します

Thread.currentThread().getContextClassLoader();

3. システムの ClassLoader を取得します

ClassLoader.getSystemClassLoader()

4. 呼び出し元の ClassLoader を取得します

DriverManager.getCallerClassLoader

ClassLoader ソース コード分析

(推奨學(xué)習(xí): Java ビデオ チュートリアル )

概要

クラス ローダーが使用されますクラス Object をロードするには、ClassLoader は抽象クラスです。クラスの バイナリ名 が與えられた場合、クラス ローダーは、定義クラスを構(gòu)成するデータを検索または生成しようとします。一般的な戦略は、指定されたバイナリ名をファイル名に変換し、このファイル名に対応するクラス ファイルをファイル システムから読み取ることです。

各 Class オブジェクトには、それを定義する ClassLoader への參照が含まれます。

配列クラスの Class オブジェクトは、クラス ローダーによって作成されませんが、Java 実行時(shí)に必要に応じて JVM によって自動的に作成されます。配列クラスのクラス ローダーの場合は、Class.getClassLoader() を通じて返されます。これは、配列內(nèi)の要素の型がネイティブ型、配列クラスにはクラス ローダーがありません [コード 1]。

アプリケーションは ClassLoader のサブクラスを?qū)g裝して、JVM がクラスを動的にロードする方法を拡張します。

クラス ローダーは通常、セキュリティ ドメインの問題を特定するためにセキュリティ管理者によって使用されます。

ClassLoader クラスは、委任モデルを使用してクラスとリソースを検索します。ClassLoader の各インスタンスには、親 ClassLoader が関連付けられています。ClassLoader がクラスまたはリソースの検索を要求されると、ClassLoader インスタンスは獨(dú)自に試行します。クラスまたはリソースを検索する前に、その親クラス ローダーが検索を完了するために委任されます。スタートアップ クラス ローダーと呼ばれる仮想マシンの組み込みクラス ローダーには親クラス ローダーがありませんが、クラス ローダー [親委任メカニズム] の親クラス ローダーとして使用できます。

同時(shí)クラスの読み込みをサポートするクラス ローダーは、並列クラス ローダーと呼ばれます。初期化中に ClassLoader.registerAsParallelCapable メソッドを通じて自身を登録する必要があります。ClassLoader クラスは、次の方法で並列として登録されます。デフォルトですが、サブクラスも並行してロードされる場合は、サブクラスを個(gè)別に登録する必要があります。

委任モデルが厳密に階層的ではない環(huán)境では、クラス ローダーは並列である必要があります。そうしないと、クラス ロード プロセス中にローダーのロックが常に保持されるため、クラス ロードでデッドロックが発生します。

通常、Java 仮想マシンは、プラットフォームに依存する方法でローカル ファイル システムからクラスをロードします。たとえば、UNIX システムでは、仮想マシンは CLASSPATH 環(huán)境で定義されたディレクトリからクラスをロードします。
ただし、一部のクラスはファイルから取得されず、ネットワークなどの他のソースから取得されたり、[動的プロキシ] がアプリケーション自體によって構(gòu)築されたりします。 defineClass(defineClass) メソッドは、バイト配列を Class のインスタンスに変換します。この新しく定義されたクラスのインスタンスは、Class.newInstance によって作成できます。

クラス ローダーによって作成されたオブジェクトのメソッドとコンストラクターは、他のクラスを參照する場合があります。參照されるクラスを決定するために、Java 仮想マシンは最初に作成したクラス ローダーの loadClass を呼び出します。クラス、メソッド。

バイナリ名: 文字列パラメータの形式で CalssLoader に提供されるクラス名は、次の 4 つの狀況を含むバイナリ名である必要があります。

  • "java.lang.String" Normal class
  • "javax.swing.JSpinner$DefaultEditor" 內(nèi)部クラス
  • "java.security.KeyStore\(Builder\)FileBuilder$1" KeyStore の內(nèi)部 內(nèi)部クラスクラス Builder の最初の匿名內(nèi)部クラス FileBuilder
  • "java.net.URLClassLoader$3$1" URLClassLoader クラスの 3 番目の匿名內(nèi)部クラス 最初の匿名內(nèi)部クラス

コード 1:

public class Test12 {
    public static void main(String[] args) {
        String[] strings = new String[6];
        System.out.println(strings.getClass().getClassLoader());
        // 運(yùn)行結(jié)果:null

        Test12[] test12s = new Test12[1];
        System.out.println(test12s.getClass().getClassLoader());
        // 運(yùn)行結(jié)果:sun.misc.Launcher$AppClassLoader@18b4aac2

        int[] ints = new int[2];
        System.out.println(ints.getClass().getClassLoader());
        // 運(yùn)行結(jié)果:null
    }
}

loadClass メソッド

loadClass のソース コードは次のとおりです。loadClass メソッドは、指定されたバイナリ名のクラスをロードします。デフォルトでは、クラスを検索します:

a) findLoadedClass(String) を呼び出して、このクラスがロードされているかどうかを確認(rèn)します

b) 親クラス ローダーの loadClass メソッドを呼び出します。クラス ローダーが null の場合、呼び出されます。 クラス ローダーを開始します。

c) findClass(String) メソッドを呼び出して find

クラスが見つかり、resolve が true の場合は、上記の手順を使用します。 solveClass(Class) メソッドは

protected Class<?> loadClass(String name, boolean resolve)
  throws ClassNotFoundException
{
  synchronized (getClassLoadingLock(name)) {
      // First, check if the class has already been loaded
      Class<?> c = findLoadedClass(name);
      if (c == null) {
          long t0 = System.nanoTime();
          try {
              if (parent != null) {
                  c = parent.loadClass(name, false);
              } else {
                  c = findBootstrapClassOrNull(name);
              }
          } catch (ClassNotFoundException e) {
              // ClassNotFoundException thrown if class not found
              // from the non-null parent class loader
          }

          if (c == null) {
              // If still not found, then invoke findClass in order
              // to find the class.
              long t1 = System.nanoTime();
              c = findClass(name);

              // this is the defining class loader; record the stats
              sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
              sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
              sun.misc.PerfCounter.getFindClasses().increment();
          }
      }
      if (resolve) {
          resolveClass(c);
      }
      return c;
  }
}

findClass メソッド

と呼ばれます。

findClass的源碼如下,findClass尋找擁有指定二進(jìn)制名稱的類,JVM鼓勵(lì)我們重寫此方法,需要自定義加載器遵循雙親委托機(jī)制,該方法會在檢查完父類加載器之后被loadClass方法調(diào)用,默認(rèn)返回ClassNotFoundException異常。

protected Class<?> findClass(String name) throws ClassNotFoundException {
    throw new ClassNotFoundException(name);
}

defineClass方法

defineClass的源碼如下,defineClass方法將一個(gè)字節(jié)數(shù)組轉(zhuǎn)換為Class的實(shí)例。

protected final Class<?> defineClass(String name, byte[] b, int off, int len,
                                     ProtectionDomain protectionDomain)
    throws ClassFormatError
{
    protectionDomain = preDefineClass(name, protectionDomain);
    String source = defineClassSourceLocation(protectionDomain);
    Class<?> c = defineClass1(name, b, off, len, protectionDomain, source);
    postDefineClass(c, protectionDomain);
    return c;
}

自定義類加載器

/**
 * 繼承了ClassLoader,這是一個(gè)自定義的類加載器
 * @author 夜的那種黑丶
 */
public class ClassLoaderTest extends ClassLoader {
    public static void main(String[] args) throws Exception {
        ClassLoaderTest loader = new ClassLoaderTest("loader");
       Class<?> clazz = loader.loadClass("classloader.Test01");
        Object object = clazz.newInstance();
        System.out.println(object);
        System.out.println(object.getClass().getClassLoader());
    }
    //------------------------------以上為測試代碼---------------------------------

    /**
     * 類加載器名稱,標(biāo)識作用
     */
    private String classLoaderName;

    /**
     * 從磁盤讀物字節(jié)碼文件的擴(kuò)展名
     */
    private String fileExtension = ".class";

    /**
     * 創(chuàng)建一個(gè)類加載器對象,將系統(tǒng)類加載器當(dāng)做該類加載器的父加載器
     * @param classLoaderName 類加載器名稱
     */
    private ClassLoaderTest(String classLoaderName) {
        // 將系統(tǒng)類加載器當(dāng)做該類加載器的父加載器
        super();
        this.classLoaderName = classLoaderName;
    }

    /**
     * 創(chuàng)建一個(gè)類加載器對象,顯示指定該類加載器的父加載器
     * 前提是需要有一個(gè)類加載器作為父加載器
     * @param parent 父加載器
     * @param classLoaderName 類加載器名稱
     */
    private ClassLoaderTest(ClassLoader parent, String classLoaderName) {
        // 顯示指定該類加載器的父加載器
        super(parent);
        this.classLoaderName = classLoaderName;
    }

    /**
     * 尋找擁有指定二進(jìn)制名稱的類,重寫ClassLoader類的同名方法,需要自定義加載器遵循雙親委托機(jī)制
     * 該方法會在檢查完父類加載器之后被loadClass方法調(diào)用
     * 默認(rèn)返回ClassNotFoundException異常
     * @param className 類名
     * @return Class的實(shí)例
     * @throws ClassNotFoundException 如果類不能被找到,拋出此異常
     */
    @Override
    protected Class<?> findClass(String className) throws ClassNotFoundException {
        byte[] data = this.loadClassData(className);
        /*
         * 通過defineClass方法將字節(jié)數(shù)組轉(zhuǎn)換為Class
         * defineClass:將一個(gè)字節(jié)數(shù)組轉(zhuǎn)換為Class的實(shí)例,在使用這個(gè)Class之前必須要被解析
         */
        return this.defineClass(className, data, 0 , data.length);
    }

    /**
     * io操作,根據(jù)類名找到對應(yīng)文件,返回class文件的二進(jìn)制信息
     * @param className 類名
     * @return class文件的二進(jìn)制信息
     * @throws ClassNotFoundException 如果類不能被找到,拋出此異常
     */
    private byte[] loadClassData(String className) throws ClassNotFoundException {
        InputStream inputStream = null;
        byte[] data;
        ByteArrayOutputStream byteArrayOutputStream = null;

        try {
            this.classLoaderName = this.classLoaderName.replace(".", "/");
            inputStream = new FileInputStream(new File(className + this.fileExtension));
            byteArrayOutputStream = new ByteArrayOutputStream();

            int ch;
            while (-1 != (ch = inputStream.read())) {
                byteArrayOutputStream.write(ch);
            }

            data = byteArrayOutputStream.toByteArray();
        } catch (Exception e) {
            throw new ClassNotFoundException();
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
                if (byteArrayOutputStream != null) {
                    byteArrayOutputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return data;
    }
}

以上是一段自定義類加載器的代碼,我們執(zhí)行這段代碼

classloader.Test01@7f31245a
sun.misc.Launcher$AppClassLoader@18b4aac2

可以看見,這段代碼中進(jìn)行類加載的類加載器還是系統(tǒng)類加載器(AppClassLoader)。這是因?yàn)閖vm的雙親委托機(jī)制造成的,private ClassLoaderTest(String classLoaderName)將系統(tǒng)類加載器當(dāng)做我們自定義類加載器的父加載器,jvm的雙親委托機(jī)制使自定義類加載器委托系統(tǒng)類加載器完成加載。

改造以下代碼,添加一個(gè)path屬性用來指定類加載位置:

public class ClassLoaderTest extends ClassLoader {
    public static void main(String[] args) throws Exception {
        ClassLoaderTest loader = new ClassLoaderTest("loader");
        loader.setPath("/home/fanxuan/Study/java/jvmStudy/out/production/jvmStudy/");
        Class<?> clazz = loader.loadClass("classloader.Test01");
        System.out.println("class:" + clazz);

        Object object = clazz.newInstance();
        System.out.println(object);
        System.out.println(object.getClass().getClassLoader());
    }
    //------------------------------以上為測試代碼---------------------------------

    /**
     * 從指定路徑加載
     */
    private String path;

    ......
    
    /**
     * io操作,根據(jù)類名找到對應(yīng)文件,返回class文件的二進(jìn)制信息
     * @param className 類名
     * @return class文件的二進(jìn)制信息
     * @throws ClassNotFoundException 如果類不能被找到,拋出此異常
     */
    private byte[] loadClassData(String className) throws ClassNotFoundException {
        InputStream inputStream = null;
        byte[] data;
        ByteArrayOutputStream byteArrayOutputStream = null;

        className = className.replace(".", "/");

        try {
            this.classLoaderName = this.classLoaderName.replace(".", "/");
            inputStream = new FileInputStream(new File(this.path + className + this.fileExtension));
            byteArrayOutputStream = new ByteArrayOutputStream();

            int ch;
            while (-1 != (ch = inputStream.read())) {
                byteArrayOutputStream.write(ch);
            }

            data = byteArrayOutputStream.toByteArray();
        } catch (Exception e) {
            throw new ClassNotFoundException();
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
                if (byteArrayOutputStream != null) {
                    byteArrayOutputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return data;
    }

    public void setPath(String path) {
        this.path = path;
    }
}

運(yùn)行一下

class:class classloader.Test01
classloader.Test01@7f31245a
sun.misc.Launcher$AppClassLoader@18b4aac2

修改一下測試代碼,并刪除工程下的Test01.class文件

public static void main(String[] args) throws Exception {
    ClassLoaderTest loader = new ClassLoaderTest("loader");
   loader.setPath("/home/fanxuan/桌面/");
    Class<?> clazz = loader.loadClass("classloader.Test01");
    System.out.println("class:" + clazz);

    Object object = clazz.newInstance();
    System.out.println(object);
    System.out.println(object.getClass().getClassLoader());
}

運(yùn)行一下

class:class classloader.Test01
classloader.Test01@135fbaa4
classloader.ClassLoaderTest@7f31245a

分析

改造后的兩塊代碼,第一塊代碼中加載類的是系統(tǒng)類加載器AppClassLoader,第二塊代碼中加載類的是自定義類加載器ClassLoaderTest。是因?yàn)镃lassLoaderTest會委托他的父加載器AppClassLoader加載class,第一塊代碼的path直接是工程下,AppClassLoader可以加載到,而第二塊代碼的path在桌面目錄下,所以AppClassLoader無法加載到,然后ClassLoaderTest自身嘗試加載并成功加載到。如果第二塊代碼工程目錄下的Test01.class文件沒有被刪除,那么依然是AppClassLoader加載。

再來測試一塊代碼

public static void main(String[] args) throws Exception {
    ClassLoaderTest loader = new ClassLoaderTest("loader");
    loader.setPath("/home/fanxuan/Study/java/jvmStudy/out/production/jvmStudy/");
    Class<?> clazz = loader.loadClass("classloader.Test01");
    System.out.println("class:" + clazz.hashCode());

    Object object = clazz.newInstance();
    System.out.println(object.getClass().getClassLoader());

    ClassLoaderTest loader2 = new ClassLoaderTest("loader");
    loader2.setPath("/home/fanxuan/Study/java/jvmStudy/out/production/jvmStudy/");
    Class<?> clazz2 = loader2.loadClass("classloader.Test01");
    System.out.println("class:" + clazz2.hashCode());

    Object object2 = clazz2.newInstance();
    System.out.println(object2.getClass().getClassLoader());
}

結(jié)果顯而易見,類由系統(tǒng)類加載器加載,并且clazz和clazz2是相同的。

class:2133927002
sun.misc.Launcher$AppClassLoader@18b4aac2
class:2133927002
sun.misc.Launcher$AppClassLoader@18b4aac2

再改造一下

public static void main(String[] args) throws Exception {
    ClassLoaderTest loader = new ClassLoaderTest("loader");
    loader.setPath("/home/fanxuan/桌面/");
    Class<?> clazz = loader.loadClass("classloader.Test01");
    System.out.println("class:" + clazz.hashCode());

    Object object = clazz.newInstance();
    System.out.println(object.getClass().getClassLoader());

    ClassLoaderTest loader2 = new ClassLoaderTest("loader2");
    loader2.setPath("/home/fanxuan/桌面/");
    Class<?> clazz2 = loader2.loadClass("classloader.Test01");
    System.out.println("class:" + clazz2.hashCode());

    Object object2 = clazz2.newInstance();
    System.out.println(object2.getClass().getClassLoader());
}

運(yùn)行結(jié)果

class:325040804
classloader.ClassLoaderTest@7f31245a
class:621009875
classloader.ClassLoaderTest@45ee12a7

ClassLoaderTest是顯而易見,但是clazz和clazz2是不同的,這是因?yàn)轭惣虞d器的命名空間的原因。

我們可以通過設(shè)置父類加載器來讓loader和loader2處于同一命名空間

public static void main(String[] args) throws Exception {
    ClassLoaderTest loader = new ClassLoaderTest("loader");
    loader.setPath("/home/fanxuan/桌面/");
    Class<?> clazz = loader.loadClass("classloader.Test01");
    System.out.println("class:" + clazz.hashCode());

    Object object = clazz.newInstance();
    System.out.println(object.getClass().getClassLoader());

    ClassLoaderTest loader2 = new ClassLoaderTest(loader, "loader2");
    loader2.setPath("/home/fanxuan/桌面/");
    Class<?> clazz2 = loader2.loadClass("classloader.Test01");
    System.out.println("class:" + clazz2.hashCode());

    Object object2 = clazz2.newInstance();
    System.out.println(object2.getClass().getClassLoader());
}

運(yùn)行結(jié)果

class:325040804
classloader.ClassLoaderTest@7f31245a
class:325040804
classloader.ClassLoaderTest@7f31245a

擴(kuò)展:命名空間

1. 每個(gè)類加載器都有自己的命名空間,命名空間由該加載器及所有的父加載器所加載的類組成

2. 在同一命名空間中,不會出現(xiàn)類的完整名字(包括類的包名)相同的兩個(gè)類

3. 在不同的命名空間中,有可能會出現(xiàn)類的完整名字(包括類的包名)相同的兩個(gè)類

php中文網(wǎng),大量的免費(fèi)Java入門教程,歡迎在線學(xué)習(xí)!??

以上がJavaクラスローダClassLoaderの詳細(xì)説明の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國語版

SublimeText3 中國語版

中國語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Java開発におけるクラスローダーの競合を解決する方法 Java開発におけるクラスローダーの競合を解決する方法 Jun 29, 2023 am 08:32 AM

Java 開発におけるクラス ローダーの競合を解決する方法 はじめに: Java 開発では、クラス ローダーの競合は一般的な問題です。異なるクラス ローダーを使用して同じクラス ファイルまたはリソース ファイルをロードすると、競合が発生し、プログラムが適切に実行できなくなります。この記事では、クラスローダーの競合とは何か、およびその解決方法について説明します。 1. クラスローダーの競合とは何ですか? Java のクラスローディングメカニズムは親委任モデルを採用しており、各クラスローダーには親クラスローダーがあり、最後の親クラスローダーは起動クラスローダーです。必要なときに

Java エラー: クラスローダー エラー、修正方法と回避方法 Java エラー: クラスローダー エラー、修正方法と回避方法 Jun 25, 2023 am 09:02 AM

Java を使用した開発中に、クラス ローダーが正しいクラスを検出またはロードしないことが原因で発生する ClassLoader エラーがよく発生します。このようなエラーが発生するとプログラムが正常に実行できなくなり、開発に支障をきたします。したがって、Java プログラムをより適切に最適化するには、ClassLoader エラーの原因とその解決策を理解する必要があります。 1. ClassLoader エラーの原因: クラスは Java の ClassLoader、ClassLoad を通じてロードされます。

SpringBoot がカスタム クラスローダーを通じてクラス ファイルを暗號化および保護(hù)する方法 SpringBoot がカスタム クラスローダーを通じてクラス ファイルを暗號化および保護(hù)する方法 May 11, 2023 pm 09:07 PM

背景 最近、jd-gui などの逆コンパイル ツールによってエンジニアリング コードが簡単に復(fù)元されないようにするために、企業(yè)のフレームワークでは主要なビジネス コードが暗號化されていますが、関連する難読化スキームの構(gòu)成と使用は比較的複雑であり、多くの問題が発生しています。 springboot プロジェクトなので、クラス ファイルが暗號化されて渡されます。カスタム クラスローダが復(fù)號化されてロードされます。このソリューションは絶対に安全というわけではありません。逆コンパイルの難易度が上がるだけです。紳士は阻止できますが、悪黨は阻止できません。全體的な暗號化保護(hù)のフローチャートが示されています。 Maven プラグインの暗號化では、カスタム Maven プラグインを使用してコンパイルします。指定されたクラス ファイルが暗號化され、暗號化されたクラス ファイルが指定されたパスにコピーされます。ここでは、resource/corecla に保存されます。

Java でクラスをロードするために ClassLoader 関數(shù)を使用する方法 Java でクラスをロードするために ClassLoader 関數(shù)を使用する方法 Jun 26, 2023 pm 04:16 PM

Java の ClassLoader 関數(shù)を使用したクラスロードの原理と方法は、常に Java 開発者の焦點(diǎn)の 1 つです。 ClassLoader 関數(shù)は Java クラス ライブラリの一部であり、その主な機(jī)能は、プログラムが正常に実行できるように Java クラス ファイルを Java 仮想マシン (JVM) にロードすることです。 ClassLoader 関數(shù)は Java クラスのロードの中核であり、Java ランタイム環(huán)境では、Java クラスのバイトコードを検索してロードする役割を果たします。そのため、これを理解して習(xí)得してください。

PHP 自動読み込みナレッジ ポイントの詳細(xì)な説明: スキルのしきい値を向上させる強(qiáng)力なツールのロックを解除する PHP 自動読み込みナレッジ ポイントの詳細(xì)な説明: スキルのしきい値を向上させる強(qiáng)力なツールのロックを解除する Feb 19, 2024 pm 03:15 PM

PHP 自動ロードの概要 PHP 自動ロードとは、クラスを使用する際に、PHP がクラスの定義ファイルを自動的にロードすることを意味します。これは通常、クラスローダーを通じて実現(xiàn)されます。クラス ローダーは、クラス定義ファイルのロードを擔(dān)當(dāng)するプログラムで、組み込みまたはカスタマイズできます。クラス ローダーのタイプ PHP に組み込まれているクラス ローダーには 2 つのタイプがあります。 Zend クラス ローダー: これは PHP のデフォルトのクラス ローダーで、PHP の組み込みライブラリにあるクラス定義ファイルをロードします。 PSR-4 クラス ローダー: PSR-4 は、クラス定義ファイルをロードするための一連のルールを定義する自動ロード標(biāo)準(zhǔn)です。 PSR-4 クラス ローダーは、PSR-4 標(biāo)準(zhǔn)に従ってクラス定義ファイルをロードします。さらに、クラスローダーはカスタマイズできます。カスタム クラス ローダーは獨(dú)自のクラス ローダーに合わせてカスタマイズできます。

Java仮想マシンにおけるクラスローダーの役割 Java仮想マシンにおけるクラスローダーの役割 Apr 13, 2024 pm 02:51 PM

クラスローダーの役割: ロード: 指定されたソースからクラスファイルを読み取ります。検証:クラスファイルが仕様に準(zhǔn)拠していることを確認(rèn)します。準(zhǔn)備: メモリを割り當(dāng)て、靜的変數(shù)を初期化します。解析: シンボル?yún)⒄栅蚪馕訾筏蓼埂3跗诨? メソッドを呼び出し、靜的初期化ブロックを?qū)g行し、クラス オブジェクトを割り當(dāng)てます。

PHP 自動ローディングの技術(shù): ローディング技術(shù)の探索 PHP 自動ローディングの技術(shù): ローディング技術(shù)の探索 Mar 02, 2024 pm 09:19 PM

オートロードは、各ファイルを手動でインクルードすることなく、PHP クラスを自動的にロードする手法です。アプリケーションの開発と保守が簡素化され、パフォーマンスと保守性が向上します。この記事では、PHP で一般的に使用されている自動読み込みテクノロジについて説明します。 SPLAutoloaderSPL (標(biāo)準(zhǔn) PHP ライブラリ) には、spl_autoload_reGISter() 関數(shù)と呼ばれる自動読み込みメカニズムが組み込まれています。この関數(shù)を使用すると、存在しないクラスをロードしようとしたときに呼び出されるローダー関數(shù)を登録できます。次の例は、SPLAutoloader の使用方法を示しています。 spl_autoload_register(function($class){

Java でクラスを動的にロードするために ClassLoader 関數(shù)を使用する方法 Java でクラスを動的にロードするために ClassLoader 関數(shù)を使用する方法 Jun 26, 2023 pm 02:10 PM

Java の ClassLoader 関數(shù)は、実行時(shí)にクラスを動的にロードできます。これは、コードの柔軟なデプロイメントと変更が必要なアプリケーションで非常に役立ちます。 ClassLoader の機(jī)能を通じて、システムの拡張性と柔軟性を向上させるプラグイン メカニズムを?qū)g裝できます。この記事では、ClassLoader関數(shù)を使って動的にクラスをロードする方法を紹介します。 1. クラスローダーの役割 Java 仮想マシン (JVM) を起動すると、次の 3 つのクラスローダーが作成されます。

See all articles