Rumah >Java >javaTutorial >Apakah mata pengetahuan tentang fail kelas java?

Apakah mata pengetahuan tentang fail kelas java?

王林
王林ke hadapan
2023-05-05 12:22:061098semak imbas

Format fail Kelas menggunakan struktur pseudo yang serupa dengan struktur bahasa C untuk menyimpan data Hanya terdapat dua jenis data dalam struktur pseudo ini: "nombor tidak bertanda" dan "jadual".

·Nombor tidak ditandatangani ialah jenis data asas U1, u2, u4 dan u8 masing-masing mewakili nombor tidak bertanda 1 bait, 2 bait, 4 bait dan 8 bait , nombor tidak bertanda boleh digunakan untuk menerangkan nombor. rujukan indeks, nilai kuantitatif, atau nilai rentetan yang dikodkan dalam UTF-8.

·Jadual ialah jenis data komposit yang terdiri daripada berbilang nombor tidak bertanda atau jadual lain sebagai item data Untuk memudahkan pembezaan, semua nama jadual biasanya berakhir dengan "_info". Jadual digunakan untuk menerangkan data dengan struktur komposit hierarki Keseluruhan fail Kelas pada asasnya boleh dianggap sebagai jadual

Apakah mata pengetahuan tentang fail kelas java?

4 perkataan pertama setiap fail Kelas Bahagian ini dipanggil bahagian. Nombor Ajaib, dan satu-satunya fungsinya ialah untuk menentukan sama ada fail ini ialah fail Kelas yang boleh diterima oleh mesin maya. Bukan sahaja fail Kelas, banyak standard format fail mempunyai tabiat menggunakan nombor ajaib untuk pengenalan Contohnya, format imej seperti GIF atau JPEG mempunyai nombor ajaib dalam pengepala fail.

Nombor ajaib fail Kelas adalah sangat "romantik", dan nilainya ialah 0xCAFEBABE (bayi kopi?)

4 bait nombor ajaib yang mengikuti menyimpan nombor versi Fail kelas. : Bait ke-5 dan ke-6 ialah nombor versi kecil (MinorVersion), dan bait ke-7 dan ke-8 ialah nombor versi utama (Versi Utama). Nombor versi Java bermula dari 45. Nombor versi utama setiap versi utama JDK yang dikeluarkan selepas JDK 1.1 dinaikkan sebanyak 1 (JDK 1.0~1.1 menggunakan nombor versi 45.0~45.3 Versi JDK yang lebih tinggi boleh serasi ke belakang dengan versi sebelumnya . versi fail Kelas, tetapi anda tidak boleh menjalankan versi fail Kelas yang terkemudian,

Kolam malar

Mengikut nombor versi utama dan kecil ialah pintu masuk kumpulan tetap , kumpulan malar Ia boleh dibandingkan dengan gudang sumber dalam fail Kelas Ia adalah data yang paling dikaitkan dengan projek lain dalam struktur fail Kelas Ia biasanya merupakan salah satu item data yang menggunakan ruang terbesar dalam fail Kelas . Di samping itu, ia adalah yang pertama muncul dalam item data jenis Jadual.

Terdapat dua jenis pemalar utama yang disimpan dalam kolam pemalar: rujukan literal dan simbolik. Literal lebih dekat dengan konsep pemalar pada peringkat bahasa Java, seperti rentetan teks, nilai pemalar yang diisytiharkan sebagai muktamad, dsb. Rujukan simbol tergolong dalam konsep prinsip kompilasi, dan terutamanya termasuk jenis pemalar berikut:

· Pakej yang dieksport atau dibuka oleh modul (Pakej)

· Nama kelas dan antara muka yang layak sepenuhnya ( Nama Layak Penuh)

·Nama medan dan deskriptor (Deskriptor)

·Nama kaedah dan deskriptor

·Cara kaedah dan jenis kaedah (Cara Kaedah, Jenis Kaedah, Invoke Dynamic )

·Tapak Panggilan Pengiraan Dinamik dan Pemalar Dinamik (Tapak Panggilan Pengiraan Dinamik, Pemalar Pengiraan Dinamik)

Apabila kod Java disusun dengan Javac, ia tidak seperti C dan Terdapat langkah "sambungan" seperti C++, tetapi sambungan dinamik dilakukan apabila mesin maya memuatkan fail Kelas (lihat Bab 7 untuk butiran). Dalam erti kata lain, maklumat susun atur akhir setiap kaedah dan medan dalam ingatan tidak akan disimpan dalam fail Kelas Jika rujukan simbolik medan dan kaedah ini tidak ditukar oleh mesin maya pada masa jalanan, alamat kemasukan memori sebenar tidak boleh. diperolehi, iaitu, Ia tidak boleh digunakan secara langsung oleh mesin maya. Apabila mesin maya memuatkan kelas, ia akan memperoleh rujukan simbol yang sepadan daripada kumpulan malar, dan kemudian menghuraikan dan menterjemahkannya ke dalam alamat memori tertentu apabila kelas dibuat atau masa jalan.

Setiap pemalar dalam kumpulan pemalar ialah jadual Pada mulanya, terdapat 11 jenis data struktur jadual dengan struktur berbeza dalam jadual pemalar Kemudian, untuk menyokong panggilan bahasa dinamik dengan lebih baik, 4 jenis dinamik tambahan adalah ditambah Pemalar berkaitan bahasa [1] Untuk menyokong sistem modular Java (Jigsaw), dua pemalar, CONSTANT_Module_info dan CONSTANT_Package_info, telah ditambah Oleh itu, pada JDK13, terdapat 17 jenis pemalar yang berbeza dalam jadual pemalar.

Apakah mata pengetahuan tentang fail kelas java?

Oleh itu, memandangkan kaedah dan medan dalam fail Kelas perlu merujuk kepada pemalar CONSTANT_Utf8_info untuk menerangkan nama, panjang maksimum pemalar CONSTANT_Utf8_info juga ialah kaedah dalam Java, Panjang maksimum nama medan. Panjang maksimum di sini ialah nilai maksimum panjang, iaitu nilai maksimum 65535 yang boleh dinyatakan oleh jenis u2. Oleh itu, jika program Java mentakrifkan pembolehubah atau nama kaedah yang melebihi 64KB aksara Inggeris, ia tidak akan disusun walaupun peraturan dan semua aksara adalah sah.

Fail Kelas /D:/BaiduYunDownload/geekbang-lessons/thinking-in-spring/validation/target/classes/org/geekbang/thinking/in/spring/validation/TestClass.class

Ubah suai Terakhir 2020-6-25; SAIZ 439 bait

MD5 Checksum 18760EE8065F9FB68D4DAB7450C4C

Disusun daripada "TestClass.java>"

🎜 > kelas awam org.geekbang.thinking.in.spring .validation.TestClass

versi minor: 0

versi utama: 52

bendera: ACC_PUBLIC, ACC_SUPER Kolam malar:3 /thinking/in/spring/validation/TestClass.m:I

   #3 = Class              #20            // org/geekbang/thinking/in/spring/validation🜎 >   #5 = Utf8               m

   #6 =                                                       #7 = Utf8               

   #8 = Utf8               ()V

   #9 = Utf8               Kod

  #10 = Utf8      Nombor #11 = Utf8               LocalVariableTable

  #12 = Utf8 this

#13 = UTF8 lorg/geekbang/pemikiran/in/spring/validation/testclass;

#14 = utf8 inc

#15 = utf8 () I #17 = UTF8 testclass.java

#18 = nameandtype#7:#8 // "& lt; init & gt;" :( ) V

  #21 = Utf8               java/lang/Object

{

  org.geekbang.thinking.in.spring.validation.TestClass();

    bendera: ACC_PUBLIC

    Kod:

      stack=1, locals=1, args_size=1

     : a     1: invokespecial #1                   // Kaedah java/lang/Object."":()V

         4: return

             Jadual Baris: 0

localvariableTable:

Tandatangan Nama Slot Panjang Mula

0 5 0 Ini lorg/geekbang/pemikiran/in/spring/validation/testclass;

public int inc();

    deskriptor: ()I

    bendera: ACC_PUBLIC

    Kod:

      stack=2, locals=1 1

          0: muat_0

1: getfield #2 // Medan m:I

4: iconst_1

5: iadd

6: ireturn

LineNumberTable:

baris 7: 0

LocalVariableTable:

Slot Panjang Mula Tandatangan Nama

0 7 0 Lorg/geekbang/thinking/in/spring/validation/ ini TestClass;

}

SourceFile: "TestClass.java"

Selepas kumpulan berterusan tamat, 2 bait seterusnya mewakili bendera akses (access_flags) Digunakan untuk mengenal pasti beberapa maklumat akses peringkat kelas atau antara muka, termasuk: sama ada Kelas ini adalah kelas atau antara muka sama ada ia ditakrifkan sebagai jenis abstrak jika ia adalah kelas, sama ada ia diisytiharkan sebagai; akhir;

Indeks kelas, indeks kelas induk dan indeks antara muka semuanya disusun mengikut urutan selepas bendera akses Indeks kelas dan indeks kelas induk diwakili oleh dua nilai indeks jenis u2 pemalar deskriptor kelas jenis CONSTANT_Class_info, melalui CONSTANT_Class_info Nilai indeks dalam pemalar jenis boleh didapati dalam rentetan nama yang layak sepenuhnya yang ditakrifkan dalam pemalar jenis CONSTANT_Utf8_info.

Sehingga kemunculan ungkapan Lambda dan kaedah lalai antara muka dalam JDK 8, arahan InvokeDynamic mempunyai tempat dalam fail Kelas yang dijana oleh bahasa Java

Jadi yang baharu dalam JDK 8 Atribut ini membenarkan pengkompil untuk

(tambah parameter -parameter semasa menyusun) untuk menulis nama kaedah ke dalam fail Kelas, dan MethodParameters ialah atribut

bagi jadual kaedah, yang sama seperti atribut Kod Ia rata dan boleh diperolehi melalui API pantulan pada masa jalan.

·Muatkan pembolehubah tempatan ke dalam tindanan operasi: iload

·Simpan nilai daripada tindanan operan ke jadual pembolehubah setempat: istore

·Muatkan pemalar ke dalam Operand tindanan: bipush

iload_, yang mewakili arahan iload_0, iload_1, iload_2 dan iload_3

·Arahan tambahan: iadd, ladd, fadd, dadd

·Subtraction arahan: isub, lsub, fsub, dsub

·Arahan pendaraban: imul, lmul, fmul, dmul

·Arahan pembahagian: idiv, ldiv, fdiv, ddiv

· Arahan baki: irem, lrem, frem, drem

·Arahan penolakan: ineg, lneg, fneg, dneg

·Arahan anjakan: ishl, ishr, iushr, lshl, lshr, lushr

·Bitwise ATAU arahan: ior, lor

·Bitwise AND arahan: iand, land

·Bitwise XOR instructions: ixor, lxor

·Penambahan pembolehubah setempat arahan: iinc

·Arahan perbandingan: dcmpg, dcmpl, fcmpg, fcmpl, lcmp

Arahan invokespecial telah ditukar dalam JDK 1.0.2 Semantics, JDK 7 menambah arahan invokedynamic dan melarang ret dan arahan jsr.

Kitaran hayat kelas

Memuatkan-> Sambungan (pengesahan, penyediaan, penghuraian)->Permulaan->Guna->Nyahpasang.

Tertib lima peringkat pemuatan, pengesahan, penyediaan, pemulaan dan pemunggahan ditentukan Proses pemuatan jenis mesti bermula langkah demi langkah dalam susunan ini, manakala peringkat penghuraian tidak semestinya: ia adalah. dalam sesetengah kes Perkara berikut boleh dimulakan selepas fasa permulaan Ini adalah untuk menyokong ciri pengikatan masa jalan bahasa Java (juga dikenali sebagai pengikatan dinamik atau pengikatan lewat).

nilai int akhir statik awam = 123;

Apabila menyusun, Javac akan menjana atribut ConstantValue untuk nilai Semasa fasa penyediaan, mesin maya akan menetapkan nilai kepada 123 berdasarkan tetapan daripada Con-stantValue.

Proses kerja model perwakilan induk ialah: jika pemuat kelas menerima permintaan pemuatan kelas, ia tidak akan cuba memuatkan kelas itu sendiri terlebih dahulu, tetapi mewakilkan permintaan itu kepada pemuat kelas induk untuk diselesaikan , ini berlaku untuk setiap peringkat pemuat kelas, jadi semua permintaan pemuatan akhirnya harus dihantar ke pemuat kelas permulaan peringkat atas Hanya apabila pemuat induk memberi maklum balas bahawa ia tidak dapat menyelesaikan permintaan pemuatan tersebut (tidak ada permintaan pemuatan sedemikian dalam cariannya. skop) Apabila kelas yang diperlukan ditemui), subloader akan cuba melengkapkan pemuatan dengan sendirinya

Pertama, pemuat kelas lanjutan (Pemuat Kelas Sambungan) digantikan dengan pemuat kelas platform (Pemuat Kelas Platform). Ini sebenarnya merupakan perubahan yang sangat logik Memandangkan keseluruhan JDK dibina berdasarkan modulariti (rt.jar dan tools.jar asal dipecahkan kepada berpuluh-puluh fail JMOD), perpustakaan kelas Java secara semulajadi mencukupi tidak perlu mengekalkan direktori libext Mekanisme sebelumnya untuk menggunakan direktori ini atau pembolehubah sistem java.ext.dirs untuk melanjutkan fungsi JDK tidak mempunyai nilai lanjut dan digunakan untuk memuatkan perpustakaan kelas ini juga menyelesaikan misi sejarahnya.

Semua tindakan penghantaran yang bergantung pada jenis statik untuk menentukan versi pelaksanaan sesuatu kaedah dipanggil penghantaran statik. Aplikasi yang paling tipikal bagi penghantaran statik ialah kaedah lebih muatan. Penghantaran statik berlaku semasa fasa penyusunan, jadi tindakan untuk menentukan penghantaran statik sebenarnya tidak dilakukan oleh mesin maya Inilah sebabnya sesetengah bahan memilih untuk mengklasifikasikannya sebagai "penghuraian" dan bukannya "penghantaran".

Mesin maya Java menyokong 5 kaedah berikut untuk memanggil arahan bytecode, iaitu:

·invokestatic. Digunakan untuk memanggil kaedah statik.

·seruan khas. Digunakan untuk memanggil kaedah pembina contoh (), kaedah peribadi dan kaedah dalam kelas induk.

·seruan maya. Digunakan untuk memanggil semua kaedah maya.

·invokeinterface. Digunakan untuk memanggil kaedah antara muka, objek yang melaksanakan antara muka akan ditentukan pada masa jalan.

·invokedynamic. Kaedah yang dirujuk oleh kelayakan tapak panggilan pertama kali diselesaikan secara dinamik pada masa jalan, dan kemudian kaedah itu dilaksanakan. Logik penghantaran bagi empat arahan panggilan pertama diperkukuh di dalam mesin maya Java, manakala logik penghantaran arahan invokedynamic ditentukan oleh kaedah but yang ditetapkan oleh pengguna.

Selagi kaedah boleh dipanggil dengan arahan invokestatic dan invokespecial, versi panggilan unik boleh ditentukan dalam fasa penghuraian Kaedah yang memenuhi syarat ini dalam bahasa Java termasuk kaedah statik, kaedah peribadi, contoh pembina, dan kelas induk Terdapat 4 kaedah, ditambah dengan kaedah yang diubah suai secara muktamad (walaupun ia dipanggil menggunakan arahan invokevirtual), 5 panggilan kaedah ini akan menyelesaikan rujukan simbol

terus kepada kaedah apabila kelas dimuatkan. Kaedah ini secara kolektif dipanggil "Kaedah Bukan Maya" (Kaedah Bukan Maya), sebaliknya, kaedah lain dipanggil "Kaedah Maya" (Kaedah Maya).

Panggilan penghuraian mestilah proses statik, yang ditentukan sepenuhnya semasa penyusunan semasa fasa penghuraian pemuatan kelas, semua rujukan simbol yang terlibat akan ditukar kepada rujukan langsung yang jelas, dan tidak perlu melengahkan masa. ia sehingga masa larian. Borang panggilan kaedah utama yang lain: panggilan penghantaran (Dispatch) adalah lebih rumit Ia mungkin statik atau dinamik Mengikut bilangan kes berdasarkan penghantaran, ia boleh dibahagikan kepada penghantaran tunggal dan berbilang penghantaran [1]. Gabungan dua jenis kaedah penghantaran ini membentuk empat kombinasi penghantaran: penghantaran tunggal statik, penghantaran berbilang statik, penghantaran tunggal dinamik dan berbilang penghantaran dinamik Mari kita lihat cara penghantaran kaedah dilakukan dalam mesin maya.

Kod ini sengaja mentakrifkan dua pembolehubah dengan jenis statik yang sama tetapi jenis sebenar berbeza, tetapi mesin maya (atau, lebih tepatnya, pengkompil) melepasi parameter apabila melebihkan Jenis statik dan bukannya jenis sebenar digunakan sebagai asas untuk penentuan

. Memandangkan jenis statik diketahui pada masa penyusunan, semasa peringkat penyusunan, pengkompil Javac menentukan versi terlampau beban yang akan digunakan berdasarkan jenis statik parameter, jadi ia memilih sayHello (Manusia) sebagai sasaran panggilan, dan menulis simbolik rujukan kaedah ini ke dalam parameter dua arahan invokevirtual dalam kaedah main().

Semua tindakan penghantaran yang bergantung pada jenis statik untuk menentukan versi pelaksanaan sesuatu kaedah dipanggil penghantaran statik. Aplikasi penghantaran statik yang paling tipikal ialah kaedah terlebih beban. Penghantaran statik berlaku semasa fasa penyusunan, jadi tindakan untuk menentukan penghantaran statik sebenarnya tidak dilakukan oleh mesin maya Inilah sebabnya sesetengah bahan memilih untuk mengklasifikasikannya sebagai "penghuraian" dan bukannya "penghantaran".

Dapat dilihat bahawa keutamaan beban lampau parameter panjang berubah adalah yang paling rendah. Medan tidak pernah mengambil bahagian dalam polimorfisme Apabila kaedah kelas mengakses medan dengan nama tertentu, nama itu merujuk kepada medan yang boleh dilihat oleh kelas.

Isi penting

Ia adalah tepat kerana langkah pertama dalam pelaksanaan arahan invokevirtual adalah untuk menentukan jenis sebenar penerima semasa runtime, jadi arahan invokevirtual dalam dua panggilan tidak Ia berakhir dengan menghuraikan rujukan simbolik kaedah dalam kolam malar kepada rujukan langsung, dan memilih versi kaedah berdasarkan jenis sebenar penerima kaedah Proses ini adalah intipati kaedah mengatasi dalam bahasa Jawa. Kami memanggil proses penghantaran ini yang menentukan versi pelaksanaan kaedah berdasarkan jenis sebenar pada masa jalan yang dipanggil penghantaran dinamik. Punca polimorfisme terletak pada logik pelaksanaan arahan panggilan kaedah maya invokevirtual Sememangnya, kesimpulan yang kita buat hanya akan sah untuk kaedah dan bukan untuk medan, kerana medan tidak menggunakan arahan ini.

Bahasa Java ialah bahasa berbilang penghantaran statik dan bahasa penghantaran tunggal dinamik.

Untuk kemudahan pelaksanaan program, kaedah dengan tandatangan yang sama harus mempunyai nombor indeks yang sama dalam jadual kaedah maya kelas induk dan subkelas, supaya apabila jenis berubah, hanya jadual kaedah maya yang dicari perlu ditukar , alamat kemasukan yang diperlukan boleh ditukar dengan indeks daripada jadual kaedah maya yang berbeza. Jadual kaedah maya biasanya dimulakan semasa fasa sambungan pemuatan kelas Selepas menyediakan nilai awal pembolehubah kelas, mesin maya juga memulakan jadual kaedah maya kelas.

Sokongan bahasa jenis dinamik

Bilangan set arahan kod bait mesin maya Java Sejak kemunculan mesin maya Java pertama Sun, hanya terdapat satu arahan baharu dalam tempoh lebih 20 tahun, iaitu set arahan kod bait dengan keluaran JDK 7. . Ahli baharu pertama kod ialah arahan invokedynamic. Arahan yang baru ditambah ini adalah salah satu penambahbaikan yang dibuat untuk mencapai matlamat projek JDK 7: untuk melaksanakan sokongan bahasa ditaip secara dinamik (Bahasa Taip Dinamik) Ia juga merupakan rizab teknikal untuk kelancaran pelaksanaan ungkapan Lambda dalam JDK 8.

Apakah bahasa yang ditaip secara dinamik [1]? Ciri utama bahasa yang ditaip secara dinamik ialah proses utama pemeriksaan jenis dilakukan semasa masa jalan dan bukannya masa penyusunan Terdapat banyak bahasa yang memenuhi ciri ini termasuk: APL, Clojure, Erlang, Groovy , javaScript, Lisp, Lua , PHP, Prolog, Python, Ruby, Smalltalk, Tcl dan banyak lagi. Sebaliknya, bahasa yang melakukan pemeriksaan jenis semasa penyusunan, seperti C++ dan Java, adalah bahasa yang paling biasa digunakan secara statik. Pembolehubah tidak mempunyai jenis tetapi hanya nilai pembolehubah yang mempunyai jenis

Menyediakan sokongan langsung untuk jenis dinamik di peringkat mesin maya Java telah menjadi masalah yang mesti diselesaikan untuk pembangunan platform Java Ini adalah invokedynamic arahan dalam cadangan JSR-292 dalam JDK 7 Dan latar belakang teknikal untuk kemunculan pakej java.lang.invoke.

Pakej java.lang.invoke [1] yang baru ditambah dalam JDK 7 ialah bahagian penting JSR 292. Tujuan utama pakej ini adalah untuk bergantung semata-mata pada rujukan simbol untuk menentukan Selain kaedah sasaran panggilan, mekanisme baharu untuk menentukan kaedah sasaran secara dinamik disediakan, dipanggil "Pengendalian Kaedah".

·Mekanisme Reflection dan MethodHandle pada dasarnya mensimulasikan panggilan kaedah, tetapi Reflection mensimulasikan panggilan kaedah pada tahap kod Java, manakala MethodHandle mensimulasikan panggilan kaedah pada tahap bytecode.

Dalam struktur direktori Tomcat, anda boleh menyediakan 3 kumpulan direktori (/common/*, /server/* dan /shared/*, tetapi ia tidak semestinya dibuka secara lalai dan hanya /lib /* direktori mungkin wujud) Digunakan untuk menyimpan perpustakaan kelas Java, sebagai tambahan kepada direktori "/WEB-INF/*" bagi aplikasi Web itu sendiri, sejumlah 4 kumpulan. Letakkan perpustakaan kelas Java dalam empat kumpulan direktori ini Setiap kumpulan mempunyai makna bebas, iaitu:

·Letakkannya dalam direktori /common. Pustaka kelas boleh digunakan oleh Tomcat dan semua aplikasi web.

·Letakkannya dalam direktori /server. Pustaka kelas boleh digunakan oleh Tomcat dan tidak dapat dilihat oleh semua aplikasi web.

·Letakkannya dalam direktori /shared. Pustaka kelas boleh digunakan oleh semua aplikasi web, tetapi tidak kelihatan kepada Tomcat sendiri.

· Diletakkan dalam direktori /WebApp/WEB-INF. Pustaka kelas hanya boleh digunakan oleh aplikasi web dan tidak kelihatan kepada Tomcat atau aplikasi web lain.

Untuk menyokong struktur direktori ini dan memuatkan serta mengasingkan perpustakaan kelas dalam direktori, Tomcat telah menyesuaikan berbilang pemuat kelas, yang dilaksanakan mengikut model delegasi induk klasik

Apakah mata pengetahuan tentang fail kelas java?

Pemuat kelas biasa, pemuat kelas Catalina (juga dipanggil Pemuat kelas pelayan), Pemuat kelas kongsi dan pemuat kelas Webapp ialah pemuat kelas Tomcat sendiri Mereka memuatkan perpustakaan kelas Java dalam /common/*, /server/*. , /shared/* dan /WebApp/WEB-INF/* masing-masing. Biasanya terdapat berbilang contoh pemuat kelas WebApp dan pemuat kelas JSP Setiap aplikasi Web sepadan dengan pemuat kelas WebApp, dan setiap fail JSP sepadan dengan pemuat kelas JasperLoader.

Skop pemuatan JasperLoader hanyalah fail Kelas yang disusun oleh fail JSP ini Tujuan kewujudannya adalah untuk dibuang: apabila pelayan mengesan bahawa fail JSP telah diubah suai, ia akan menggantikan JasperLoader semasa. contoh, dan cipta pemuat kelas JSP baharu untuk melaksanakan fungsi HotSwap fail JSP.

Atas ialah kandungan terperinci Apakah mata pengetahuan tentang fail kelas java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam