Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Menjelajahi Modul API di Java 9

Java 9 menggabungkan API dalam kumpulan modul. Oleh karena itu, modularitas adalah tema sentral; ini mempengaruhi desain program dari tingkat atas. Program dapat dibangun secara modular sejak awal. Tidak mengherankan bahwa akan ada API untuk menangani secara khusus elemen pemrograman yang disebut modul . API menyediakan cara untuk mengakses modul secara terprogram. API ini sangat berguna untuk mendapatkan informasi spesifik tentang modul atau untuk membaca atau memanipulasinya. Artikel ini mengeksplorasi kelas Modul API dan beberapa metode, dengan contoh untuk memberi Anda gambaran tentang fungsionalitasnya secara keseluruhan.

Ikhtisar

Java 9 menyediakan satu set kelas dan antarmuka untuk menangani modul secara terprogram. API ini sangat berguna untuk:

  • Membaca, memuat, dan mencari modul
  • Membaca dan memanipulasi deskriptor modul

Daftar API tercakup terutama dalam paket:java.lang dan java.lang.module . Meskipun java.lang.module paket terdiri dari sebagian besar kelas dan antarmuka untuk menangani deskriptor modul, java.lang paket berisi kelas Modul , ModuleLayer , dan pengecualian, LayerInstantiationException . Di antara ketiganya, Modul kelas sangat penting karena turunan dari kelas ini menyediakan semua metode yang terhubung ke modul membaca, memuat, dan mencari. Kelas paling penting dalam java.lang.module paketnya adalah ModuleDescriptor . Kelas ini menyediakan metode yang diperlukan untuk menangani deskriptor modul.

Modul API

Menurut Dokumentasi Java API, kelas modul mewakili modul run-time bernama dan tidak bernama. Modul yang diberi nama memiliki nama dan dibangun oleh Java Virtual Machine ketika grafik modul didefinisikan ke mesin virtual Java untuk membuat lapisan modul. Modul yang tidak disebutkan namanya tidak memiliki nama. Ada modul tanpa nama untuk setiap ClassLoader , diperoleh dengan menjalankan getUnnamedModule metode. Semua tipe yang tidak ada dalam modul bernama adalah anggota dari modul tanpa nama pemuat kelas yang menentukan.

Sangat mudah untuk mengetahui modul kelas yang dimilikinya. Misalnya, jika kita ingin mengetahui modul suatu kelas, katakanlah ArrayList , dari Collection API atau, katakanlah, Aplikasi dari JavaFX, kami dapat melakukannya dengan cara berikut.

Class<ArrayList> c= ArrayList.class;
Module mod=c.getModule();
System.out.println(mod.getName());

Atau, dalam satu pernyataan, sebagai berikut:

System.out.println(Application.class
   .getModule().getName());

Ini mencetak nama modul kelas, seperti java.base , untuk Daftar Array , dan javafx.graphics untuk Aplikasi . Karena sebuah modul dapat diberi nama atau tanpa nama, kita dapat mengetahuinya dengan menjalankan isNamed() metode. Metode ini mengembalikan benar jika modul bernama atau salah jika itu adalah modul yang tidak disebutkan namanya. Berikut adalah contoh modul tanpa nama.

package org.mano.java9.examples;
public class Main {
   public static void main(String[] args) {
      Class<Main> c= Main.class;
      Module mod=c.getModule();
      System.out.println(mod);
      System.out.println(mod.getName());
      System.out.println(mod.getName()+" is "
         +(mod.isNamed()?
         "Named Module":"Unnamed Module"));
      System.out.println(mod.getDescriptor());
   }
}

Keluaran:

unnamed module @4c75cab9
null
null is Unnamed Module
null

Dan, untuk modul bernama, kita dapat menulis sebagai berikut:

package org.mano.java9.examples;
import java.util.ArrayList;
public class Main {
   public static void main(String[] args) {
      Class<ArrayList> c= ArrayList.class;
      Module mod=c.getModule();<
      System.out.println(mod);
      System.out.println(mod.getName());
      System.out.println(mod.getName()+" is "
         +(mod.isNamed()?
         "Named Module":"Unnamed Module"));
      System.out.println(mod.getDescriptor());
   }
}

Keluaran:

module java.base
java.base
java.base is Named Module
module { name: [email protected], uses:
   [java.nio.file.spi.FileTypeDetector, ...}

Sebuah ModuleLayer hanya berisi modul bernama. Kita dapat memanggil getLayer metode untuk mendapatkan informasi tentang lapisan yang dikandungnya dalam modul. Jika mengembalikan null, itu berarti modul tersebut tidak dalam lapisan, atau modul yang tidak disebutkan namanya. Jika kita ingin mendapatkan daftar paket yang tersedia dalam sebuah modul, kita dapat memanggil getPackages metode. getClassLoader metode mengembalikan pemuat kelas modul. Berikut adalah contoh untuk mengilustrasikan metode yang dijelaskan di atas.

package org.app.module1;
import javafx.application.Application;
import java.util.Set;
public class Main {
   public static void main(String[] args) {
      Class<Application> c = Application.class;
      Module mod = c.getModule();
      System.out.println("Name :" 
         + mod.getName());
      System.out.println(mod.getName() + " is " 
         + (mod.isNamed() ? "Named Module" :
         "Unnamed Module"));
      System.out.println("Layer :" + mod.getLayer());
      System.out.println("ClassLoader :"
         + mod.getClassLoader());
      System.out.println("List of
         Packagesn.....................");
      Set<String> set = mod.getPackages();
      int i=1;
      for (String s : set) {
         System.out.println(i+++") "+s);
      }
   }
}

Keluaran:

Name :javafx.graphics
javafx.graphics is Named Module
Layer :jdk.compiler, java.compiler, jdk.management.jfr,
   jdk.scripting.nashorn, ...
ClassLoader :jdk.internal.loader.ClassLoaders
   [email protected]
....................
List of Packages
.....................
1) com.sun.javafx.stage
2) com.sun.scenario.effect.impl.prism.ps
3) javafx.print
...
107) com.sun.prism.j2d
108) javafx.scene.image

Deskripsi Modul

Menurut Dokumentasi Java 9 API, "Descriptor modul menjelaskan modul bernama dan mendefinisikan metode untuk mendapatkan masing-masing komponennya." Deskripsi modul untuk modul bernama di mesin virtual Java diperoleh dengan menjalankan Modul getDescriptor metode. Deskriptor modul juga dapat dibuat dengan menggunakan ModuleDescriptor.Builder class atau dengan membaca bentuk biner dari deklarasi modul (module-info.class ) menggunakan baca metode yang didefinisikan dalam kelas ini.

Oleh karena itu, biasanya ModuleDescriptor instance mewakili definisi modul yang ditemukan dalam bentuk biner dari file deskriptor modul, yang disebut module-info.class . Selain membaca dan memanipulasi definisi modul, kita dapat menggunakan ModuleDescriptor.Builder class untuk mendeskripsikan modul pada saat run time.

Deskripsi modul menjelaskan tiga jenis modul, seperti modul normal, terbuka, dan otomatis.

Modul normal dan modul terbuka secara eksplisit menjelaskan layanan yang mereka sediakan atau gunakan, dependensi, paket yang diekspor, dan komponen lainnya. Perbedaan utama antara modul normal dan modul terbuka adalah Modul normal dapat membuka paket tertentu. Pendeskripsi modul untuk modul terbuka tidak mendeklarasikan paket terbuka apa pun (membuka metode mengembalikan set kosong), tetapi ketika dipakai di mesin virtual Java, diperlakukan seolah-olah semua paket terbuka.

Modul otomatis, bagaimanapun, tidak mendeklarasikan ekspor, paket terbuka, atau dependensi kecuali deklarasi implisit java.base modul. Saat modul otomatis dibuat di mesin virtual Java, modul tersebut membaca setiap modul yang tidak disebutkan namanya dan diperlakukan seolah-olah semua paket diekspor dan dibuka.

getDescriptor metode Modul class mengembalikan sebuah instance dari ModuleDescriptor kelas. ModuleDescriptor kelas berisi kelas bersarang statis yang instance mewakili pernyataan direktif dalam file deklarasi modul. Kelas, bagaimanapun, tidak mengandung penggunaan pernyataan yang biasanya dapat diwakili oleh instance layanan String . Ini dia empat lainnya:

  • ModuleDescriptor.Memerlukan
  • ModuleDescriptor.Opens
  • ModuleDescriptor.Provides
  • ModuleDescriptor.Ekspor

Contoh Singkat

package org.mano.java9.examples;
import javax.sql.RowSet;
import java.lang.module.ModuleDescriptor;
import java.util.List;
public class Main {
   public static void main(String[] args) {
      System.out.println("Module Name: "
         + List.class.getModule().getName());
      show(List.class.getModule().getDescriptor());
      System.out.println("Module Name: "
         + RowSet.class.getModule().getName());
      show(RowSet.class.getModule().getDescriptor());
   }
   public static void show(ModuleDescriptor d) {
      System.out.println("Module
         Descriptionn-------------------------");
      System.out.println("Requires: " + d.requires());
      System.out.println("Exports: " + d.exports());
      System.out.println("Uses: " + d.uses());
      System.out.println("Provides: " + d.provides());
      System.out.println("Packages: " + d.packages());
   }
}

Keluaran:

Module Name: java.base
Module Description
-------------------------
Requires: []
Exports: [jdk.internal.org.objectweb.asm.signature to
   [jdk.scripting.nashorn], ...]
Uses: [java.util.spi.LocaleNameProvider,
   java.nio.file.spi.FileSystemProvider, ...]
Provides: [java.nio.file.spi.FileSystemProvider with
   [jdk.internal.jrtfs.JrtFileSystemProvider]]
Packages: [java.nio.file, jdk.internal.org.objectweb.asm
   .tree.analysis, com.sun.security.ntlm, ...]
Module Name: java.sql
Module Description
-------------------------
Requires: [mandated java.base, transitive java.logging,
   transitive java.xml]
Exports: [java.sql, javax.transaction.xa, javax.sql]
Uses: [java.sql.Driver]
Provides: []
Packages: [javax.sql, javax.transaction.xa, java.sql]

File biner deskriptor modul, disebut module-info.class , dapat langsung dibaca dengan cara berikut untuk membuat instance ModuleDescriptor kelas:

try {
   ModuleDescriptor descriptor = ModuleDescriptor
      .read(new FileInputStream("module-info.class"));
} catch (IOException ex) { }

Ada empat versi pembacaan statis . yang kelebihan beban metode yang ditentukan dalam ModuleDescriptor kelas. Mereka digunakan untuk membaca bentuk biner dari deskripsi modul dari aliran input atau buffer byte. Berikut adalah hasil ekstraksi dari dokumentasi Java 9 API.

  • baca(InputStream in) :Membaca bentuk biner dari deklarasi modul dari aliran input sebagai deskriptor modul.
  • read(InputStream in, Supplier > packageFinder) :Membaca bentuk biner dari deklarasi modul dari aliran input sebagai deskriptor modul.
  • baca(ByteBuffer bb) :Membaca bentuk biner dari deklarasi modul dari buffer byte sebagai deskriptor modul.
  • read(ByteBuffer bb, Pemasok > packageFinder) :Membaca bentuk biner dari deklarasi modul dari buffer byte sebagai deskriptor modul.

Paket yang disetel oleh packageFinder termasuk semua paket yang modul ekspor, buka, layanan yang disediakan, dan paket kelas utama yang tidak dikodekan oleh deskriptor yang disediakan dalam aliran input atau buffer byte.

Kesimpulan

Selain membaca informasi dasar tentang modul, Modul class menyediakan beberapa metode kunci untuk menanyakan tentang status modul—apakah itu dibaca, dibuka, diekspor, dan sebagainya. API juga menyediakan metode seperti addOpens , tambahkan Ekspor , addUses , dan tambahkanBaca untuk menambahkan penggunaan terbuka dan ekspor dan membaca pernyataan ke deskriptor modul secara terprogram. Singkatnya, Module API menyediakan banyak metode lain untuk secara khusus menangani modul secara terprogram. Di sini, kami baru saja menggores permukaannya untuk memberikan gambaran awal tentang apa itu semua.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ketik dengan Kuat Parameter Bernilai Tabel itu

  2. Server Tertaut Salesforce.com dan sp_columns_ex

  3. Bucketizing data tanggal dan waktu

  4. Membuat Kasus untuk BUKAN Pemicu – Bagian 1

  5. Paket Berbeda untuk Server Identik