Możliwość umieszczania znaczników w kodzie źródłowym aplikacji J2C w języku Java pozwala korzystać z funkcjonalności, jaką oferuje biblioteka Doclet J2C.
Znaczniki biblioteki Doclet to znaczniki programistyczne służące do tworzenia adnotacji. Udostępniają one rozbudowany mechanizm generowania artefaktów aplikacji, gotowych do wdrożenia w środowisku J2EE. Po wprowadzeniu znaczników biblioteki Doclet do kodu źródłowego aplikacji J2C w języku Java
artefakty te są generowane automatycznie
(po naciśnięciu klawiszy CTRL+S w celu zapisania kodu).
Znaczniki biblioteki Doclet wstawia się do kodu źródłowego w języku Java w postaci komentarzy w stylu Javadoc. Znaczniki programistyczne oparte na adnotacjach mają atrybuty Scope (czyli "zasięg" - określa, w którym miejscu w kodzie występuje dany znacznik) i Multiplicity (czyli "krotność" - określa, ile razy znacznik może zostać użyty).
Obsługiwane znaczniki biblioteki Doclet:
Tworząc aplikacje J2C w języku Java, można umieszczać w kodzie źródłowym następujące rodzaje znaczników:
- Znaczniki J2C
- Znaczniki deskryptora typu:
Atrybuty znacznika biblioteki Doclet
- Scope: Atrybut Scope określa położenie znaczników wewnątrz pliku źródłowego w języku Java. Cztery dostępne opcje to: package (pakiet), class (klasa), method (metoda) i field (pole).
- Package
Dodany do komentarza pakietu. Ten zasięg oznacza informacje odnoszące się do całego pakietu, modułu lub aplikacji w języku Java.
- Class
Dodany do komentarza klasy. Ten zasięg oznacza informacje odnoszące się do całego typu lub interfejsu w języku Java.
- Method
Dodany do komentarza konkretnej metody wewnątrz klasy. Ten zasięg oznacza informacje odnoszące się do danej metody w ramach klasy.
- Field
Dodany do komentarza konkretnego pola wewnątrz klasy. Ten zasięg oznacza informacje odnoszące się do danego pola w ramach klasy.
- Multiplicity: Atrybut Multiplicity określa, ile razy dany znacznik może wystąpić w pojedynczym pliku źródłowym w języku Java. W notacji biblioteki Doclet wartość tego atrybutu podaje się w nawiasach, tuż za nazwą znacznika.
- 0..1: Oznacza, że w pliku źródłowym w języku Java dany znacznik może zostać użyty co najwyżej jeden raz.
- 0..n: Oznacza, że w pliku źródłowym w języku Java dany znacznik może zostać użyty dowolną liczbę razy.
Przykład: Poniższy przykład pochodzi z kursu
IMS Multisegment
Output (Wielosegmentowe wyjście w systemie IMS):
- W widoku Eksplorator projektów rozwiń gałąź projektu, a następnie gałęzie Zasoby Java i Źródło Java.
- Kliknij pakiet prawym przyciskiem myszy (w tym przypadku będzie to plik sample.ims) i wybierz opcje Nowy > Klasa, aby uruchomić kreator
Nowa klasa.
- Jako nazwę klasy wpisz CCIBuffer. Zaakceptuj wszystkie ustawienia domyślne.
- Kliknij przycisk Zakończ, a klasa CCIBuffer zostanie otwarta w edytorze
Java.
- W sekcji komentarza klasy CCIBuffer wprowadź znacznik @type-descriptor.message-buffer,
w następujący sposób:
- Naciśnij klawisze CTRL+S, aby zapisać zmiany. W pliku klasy CCIBuffer.java zostanie automatycznie wygenerowany następujący kod:
/*
* Created on Oct 13, 2004
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package sample.ims;
/**
* @author ivyho
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
* @type-descriptor.message-buffer
*/
public class CCIBuffer implements javax.resource.cci.Record,
javax.resource.cci.Streamable, com.ibm.etools.marshall.RecordBytes {
private byte[] buffer_ = null;
/**
* @generated
*/
public CCIBuffer() {
return;
}
/**
* @generated
* @see javax.resource.cci.Record#getRecordShortDescription()
*/
public String getRecordShortDescription() {
return (this.getClass().getName());
}
/**
* @generated
* @see javax.resource.cci.Record#hashCode()
*/
public int hashCode() {
return (super.hashCode());
}
/**
* @generated
* @see javax.resource.cci.Streamable#write(OutputStream)
*/
public void write(java.io.OutputStream outputStream)
throws java.io.IOException {
outputStream.write(buffer_);
}
/**
* @generated
* @see javax.resource.cci.Record#setRecordShortDescription(String)
*/
public void setRecordShortDescription(String shortDescription) {
return;
}
/**
* @generated
*/
public int getSize() {
if (buffer_ != null)
return (buffer_.length);
else
return (0);
}
/**
* @generated
* @see java.lang.Object#toString
*/
public String toString() {
StringBuffer sb = new StringBuffer(super.toString());
sb.append("\n");
com.ibm.etools.marshall.util.ConversionUtils.dumpBytes(sb, buffer_);
return (sb.toString());
}
/**
* @generated
* @see javax.resource.cci.Record#getRecordName()
*/
public String getRecordName() {
return (this.getClass().getName());
}
/**
* @generated
*/
public byte[] getBytes() {
return (buffer_);
}
/**
* @generated
* @see javax.resource.cci.Record#clone()
*/
public Object clone() throws CloneNotSupportedException {
return (super.clone());
}
/**
* @generated
* @see javax.resource.cci.Record#setRecordName(String)
*/
public void setRecordName(String recordName) {
return;
}
/**
* @generated
* @see javax.resource.cci.Record#equals()
*/
public boolean equals(Object object) {
return (super.equals(object));
}
/**
* @generated
* @see javax.resource.cci.Streamable#read(InputStream)
*/
public void read(java.io.InputStream inputStream)
throws java.io.IOException {
byte[] input = new byte[inputStream.available()];
inputStream.read(input);
buffer_ = input;
}
/**
* @generated
*/
public void setBytes(byte[] bytes) {
buffer_ = bytes;
}
}