logo

Interfejs znacznika w Javie

W tej części omówimy interfejs znacznika w Javie , jego wykorzystuje, wbudowany ( Możliwość serializacji , Możliwość klonowania i zdalne interfejsy) I niestandardowy interfejs znacznika z przykładami.

Co to jest interfejs znacznika?

Jakiś interfejs który nie zawiera metod, pól i stałych, jest nazywany interfejs znacznika . Innymi słowy, pusty interfejs nazywany jest interfejs znacznika Lub interfejs tagów. Dostarcza informacje o typie wykonania obiektu. To jest powód, dla którego JVM i kompilator mają dodatkowe informacje o obiekcie. The Możliwość serializacji I Możliwość klonowania interfejsy są przykładem interfejsu znacznika. Krótko mówiąc, wskazuje sygnał lub polecenie dla JVM.

mecz_preg

Deklaracja interfejsu znacznika jest taka sama jak interfejsu w Javie, ale interfejs musi być pusty. Na przykład:

 public interface Serializable { } 

Istnieją dwie alternatywy interfejsu znacznika, które dają taki sam wynik jak interfejs znacznika.

    Flagi wewnętrzne:Można go używać zamiast interfejsu znacznika, aby wskazać dowolną konkretną operację.Adnotacje:Od wersji Java 5, interfejsy znaczników są pomijane . Zamiast interfejsu znacznika Java 5 udostępnia interfejs adnotacje aby osiągnąć te same rezultaty. Umożliwia elastyczne wykorzystanie metadanych. Dlatego stosując adnotacje do dowolnej klasy, możemy wykonać określoną akcję.

Zastosowania interfejsu znaczników

Interfejs znacznika służy jako znacznik informujący kompilator Java za pomocą komunikatu, dzięki czemu może on dodać specjalne zachowanie do klasy, która go implementuje. Interfejs znaczników Java jest przydatny, jeśli mamy informacje o klasie i te informacje nigdy się nie zmieniają. W takich przypadkach używamy interfejsu znaczników reprezentujących, aby reprezentować to samo. Implementacja pustego interfejsu nakazuje kompilatorowi wykonanie pewnych operacji.

Służy do logicznego podziału kodu i jest dobrym sposobem na kategoryzację kodu. Jest bardziej przydatny do tworzenia API i frameworków takich jak Spring.

Wbudowany interfejs znacznika

W Jawa wbudowane interfejsy znaczników to interfejsy, które są już obecne w JDK i gotowe do użycia. Istnieje wiele wbudowanych interfejsów znaczników, niektóre z nich to:

  • Możliwość klonowania interfejsu
  • Interfejs umożliwiający serializację
  • Zdalny interfejs

Omówmy szczegółowo jeden po drugim.

Możliwość klonowania interfejsu

Możliwość czyszczenia interfejsu w Javie jest także interfejsem znaczników, do którego należą Java.lang pakiet. Generuje replikę (kopię) obiektu o innej nazwie. Możemy zaimplementować interfejs w klasie, której obiekt klasy ma zostać sklonowany. Wskazuje klon() metoda klasy Object. Jeżeli nie zaimplementujemy w klasie interfejsu Cloneable i wywołamy metodę clone(), to wyrzuci ona błąd Wyjątek ClassNotSupportedException.

Należy pamiętać, że klasa implementująca interfejs Cloneable musi zastąpić metodę clone() metodą publiczną. Zobaczmy przykład.

Produkt.java

 import java.util.Scanner; public class Product implements Cloneable { int pid; String pname; double pcost; //Product class constructor public Product (int pid, String pname, double pcost) { this.pid = pid; this.pname = pname; this.pcost = pcost; } //method that prints the detail on the console public void showDetail() { System.out.println('Product ID: '+pid); System.out.println('Product Name: '+pname); System.out.println('Product Cost: '+pcost); } public static void main (String args[]) throws CloneNotSupportedException { //reading values of the product from the user Scanner sc = new Scanner(System.in); System.out.print('Enter product ID: '); int pid = sc.nextInt(); System.out.print('Enter product name: '); String pname = sc.next(); System.out.print('Enter product Cost: '); double pcost = sc.nextDouble(); System.out.println('-------Product Detail--------'); Product p1 = new Product(pid, pname, pcost); //cloning the object of the Product class using the clone() method Product p2 = (Product) p1.clone(); //invoking the method to print detail p2.showDetail(); } } 

Wyjście:

 Enter product ID: 139872 Enter product name: Printer Enter product Cost: 3459.67 -------Product Detail-------- Product ID: 139872 Product Name: Printer Product Cost: 3459.67 

Interfejs umożliwiający serializację

Jest to interfejs znacznikowy w Javie zdefiniowany w pliku Java.io pakiet. Jeśli chcemy, aby klasa mogła być serializowana, musimy zaimplementować metodę Możliwość serializacji interfejs. Jeśli klasa implementuje interfejs Serializable, możemy serializować lub deserializować stan obiektu tej klasy.

Serializacja (konwersja obiektu na strumień bajtów) to mechanizm, w którym stan obiektu jest odczytywany z pamięci i zapisywany do pliku lub bazy danych . Deserializacja (konwersja strumienia bajtów na obiekt) jest przeciwieństwem serializacji odczyt stanu obiektu z pliku lub bazy danych i zapisanie go z powrotem do pamięci nazywa się deserializacją obiektu.

Interfejs znacznika w Javie

Serializację (zapis) można osiągnąć za pomocą metody Strumień wyjściowy obiektu klasę i deserializację (odczyt) można osiągnąć za pomocą Strumień wejściowy obiektu klasa.

Zobaczmy przykład serializacji i deserializacji.

Przykład serializacji

Pracownik.java

 import java.io.Serializable; public class Employee implements Serializable { int empid; String empname; public Employee(int empid, String empname) { this.empid = empid; this.empname = empname; } } 

SerializacjaPrzykład.java

 import java.io.*; class SerializationExample { public static void main(String args[]) { try { //Creating the object Employee emp =new Employee(1187345,'Andrew'); //Creating stream and writing the object FileOutputStream fout=new FileOutputStream('employee data.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(emp); out.flush(); //closing the stream out.close(); System.out.println('Data has been read from the file.'); } catch(Exception e) { e.printStackTrace(); } } } 

Wyjście:

 Data has been read from the file. 

Przykład deserializacji

Deserializujmy stan obiektu.

DeserializacjaPrzykład.java

 import java.io.*; class DeserializationExample { public static void main(String args[]) { try { //Creating stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('employee data.txt')); Employee emp=(Employee)in.readObject(); //printing the data of the serialized object System.out.println(emp.empid+' '+emp.empname); //closing the stream in.close(); } catch(Exception e) { e.printStackTrace(); } } } 

Wyjście:

 1187345 Andrew 

Zdalny interfejs

Zdalny interfejs to interfejs znaczników, do którego należy Java.rmi pakiet. Oznacza obiekt jako zdalny, do którego można uzyskać dostęp z innego komputera (hosta). Musimy zaimplementować interfejs zdalny, jeśli chcemy, aby obiekt był zdalny. Identyfikuje interfejsy, których metody można wywołać z nielokalnej maszyny JVM. Każdy zdalny obiekt musi implementować interfejs bezpośrednio lub pośrednio.

Zdefiniujmy interfejs zdalny i zaimplementujmy go w programie Java.

Definiowanie interfejsu zdalnego

 import java.rmi.*; public interface AddAll extends Remote { public int add(int r, int s)throws RemoteException; } 

Zaimplementuj zdalny interfejs

Istnieją dwa sposoby implementacji interfejsu zdalnego:

co robi Ravel w Pythonie
  • Rozszerzając klasę UnicastRemoteObject
  • Korzystając z metody eksportObject() klasy UnicastRemoteObject

DodajAllRemote.java

 import java.rmi.*; import java.rmi.server.*; public class AddAllRemote extends UnicastRemoteObject implements Adder { AddAllRemote()throws RemoteException { super(); } public int add(int r, int s) { return r+s; } 

Utwórz i uruchom aplikację zdalną

Serwer.java

 import java.rmi.*; import java.rmi.registry.*; public class Server { public static void main(String args[]) { try { AddAll stub=new AddAllRemote(); Naming.rebind('rmi://localhost:5000/sak',stub); } catch(Exception e) { System.out.println(e); } } } 

Utwórz i uruchom aplikację kliencką

Klient.java

 import java.rmi.*; public class Client { public static void main(String args[]) { try { AddAll stub=(AddAll)Naming.lookup('rmi://localhost:5000/sak'); System.out.println(stub.add(29,18)); } catch(Exception e) { } } } 

Niestandardowy interfejs znacznika

Oprócz wbudowanego interfejsu znaczników, Java pozwala także na stworzenie własnego interfejsu znaczników. Zobaczmy przykład.

CustomMarkerInterfaceExample.java

 //custom marker interface interface Car { } //custom marker interface interface Engine { } //class that implements the Car marker interface class Vehicle implements Car { static void isVehicle() { System.out.println('Car is a vehicle.'); } } //class that implements the Engine marker interface class Status implements Engine { static void isWorking() { System.out.println('Yes, engine is working.'); } } //main class public class CustomMarkerInterfaceExample { public static void main(String args[]) { //invoking the methods of the class Vehicle.isVehicle(); Status.isWorking(); } } 

Wyjście:

 Car is a vehicle. Yes, engine is working.