- Аннотации в JAVA
- Применение
- Синтаксис
- Где в коде можно использовать аннотации
- Создание аннотации
- Синтаксис
- Пример
- Предопределенные аннотации
- Аннотации, использующиеся компилятором
- Аннотации, применимые к другим аннотациям (мета-аннотации)
- Повторяющиеся аннотации
- Определение
- Пример
- Создание повторяющейся аннотации
- Получение повторяющихся аннотаций
- Аннотации типов
- Определение
- Создание аннотации типов
- Применение
- Metadata in Java
- Types of Metadata
- How does Metadata work in Java?
- Examples to Implement Metadata in Java
- Example #1 – Result Set Metadata
- Example #2 – Database Metadata
- Example #3 – Database Metadata for Extracting Table Names
- Conclusion
- Recommended Articles
Аннотации в JAVA
Аннотации — это форма метаданных. Они предоставляют информацию о программе, при том сами частью программы не являются.
Применение
- Информация для компилятора. Могут использоваться компилятором для обнаружения ошибок и подавления предупреждений.
- Обработка во время компиляции и развертывания. Программа может создавать код, XML-файлы и т.п. на основе аннотаций.
- Обработка во время выполнения. Некоторые аннотации могут использоваться во время выполнения программы.
Синтаксис
Начинаются с @ , могут включать элементы, которым присваиваются значения:
@Author( name = "Benjamin Franklin" date = "3/27/2003" ) class MyClass
Если такой элемент один, его имя можно опустить:
@SupressWarnings("unchecked") void MyMethod()
Если таких элементов нет, можно опустить скобки. Можно использовать несколько аннотаций в одном объявлении:
@Author(name = "Jane Doe") @EBook class MyClass
Аннотации могут быть повторяющимися.
@Author(name = "Jane Doe") @Author(name = "John Smith") class MyClass
Где в коде можно использовать аннотации
Аннотации применяются с объявлениями классов, полей и других элементов программы.
Аннотации, использующиеся с типами, называются аннотациями типов. Примеры таких аннотаций:
myString = (@NonNull String) str;
class UnmodifiableList implements @Readonly List
void monitorTemperature() throws @Critical TemperatureException
Создание аннотации
Синтаксис
Описание аннотации напоминает описание интерфейса. Оно начинается с @Interface , а его элементы похожи на методы, которые могут иметь дефолтные значения.
Пример
Допустим, в какой-то IT-компании тела всех классов начинаются с комментариев, содержащих важную информацию:
public class Generation3List extends Generation2List < // Author: John Doe // Date: 3/17/2002 // Current revision: 6 // Last modified: 4/12/2004 // By: Jane Doe // Reviewers: Alice, Bill, Cindy // class code goes here >
Описание аннотации, которая заменит комментарии:
Использование созданной аннотации:
@ClassPreamble ( author = "John Doe", date = "3/17/2002", currentRevision = 6, lastModified = "4/12/2004", lastModifiedBy = "Jane Doe", reviewers = ) public class Generation3List extends Generation2List
Замечание: для добавления аннотации в Javadocs нужно использовать @Documented:
import java.lang.annotation.*; @Documented @interface ClassPreamble < // Описание элементов аннотации >
Предопределенные аннотации
В Java есть аннотации, описанные заранее. Часть из них предоставляют информацию для компилятора, часть применяется к другим аннотациям.
Аннотации, использующиеся компилятором
Располагаются в пакете java.lang.
Помеченный этой аннотацией элемент устарел и больше не должен использоваться (это стоит отметить в Javadoc). При наличии такого элемента в программе компилятор сгенерирует предупреждение.
// Комментарий Javadoc: /** * @deprecated * объяснение, почему метод устарел. */ @Deprecated static void deprecatedMethod()
Информирует компилятор о том, что аннотируемый элемент должен переопределять элемент родительского класса. При некорректном переопределении компилятор сгенерирует ошибку.
@Override int overriddenMethod()
Подавляет генерируемые компилятором предупреждения.
Предупреждения делятся на непроверенные (unchecked) и устаревшие (deprecation). Первые возникают при использовании устаревшего кода, написанного до дженериков, вторые — при использовании кода, помеченного аннотацией @Deprecated.
Можно подавить как одну категорию, так и обе сразу:
Применяется к методу или конструктору и утверждает, что код не выполняет потенциально небезопасных операций с параметрами varargs. При использовании аннотации подавляются unchecked предупреждения, связанные с varargs.
@SafeVarargs // На самом деле не безопасно! static void m(List. stringLists) < Object[] array = stringLists; ListtmpList = Arrays.asList(42); array[0] = tmpList; //Написано неверно, но скомпилируется без предупреждения String s = stringLists[0].get(0); //ClassCastException >
Используется при описании функционального интерфейса. Подчеркивает, что это именно функциональный интерфейс.
@FunctionalInterface public interface Predicate
Аннотации, применимые к другим аннотациям (мета-аннотации)
Располагаются в пакете java.lang.annotation.
Указывает, сколько хранится отмеченная аннотация.
- RetentionPolicy.SOURCE . Отмеченная аннотация сохраняется только на уровне исходного кода и игнорируется компилятором.
- RetentionPolicy.CLASS . Сохраняется компилятором во время компиляции, но игнорируется JVM.
- RetentionPolicy.RUNTIME . Сохраняется JVM для использования во время выполнения программы.
Указывает, что аннотация, должна быть задокументирована в Javadoc (по умолчанию аннотации не документируются).
Определяет права доступа аннотации (к каким элементам ее можно применять). В аннотации @Target указывается одно из следующих значений:
- ElementType.ANNOTATION_TYPE . Применяется к аннотации
- ElementType.CONSTRUCTOR . Применяется к конструктору.
- ElementType.FIELD . Применяется к полю или свойству.
- ElementType.LOCAL_VARIABLE . Применяется к локальной переменной.
- ElementType.METHOD . Применяется к методу.
- ElementType.PARAMETER . Применяется к параметру метода.
- ElementType.TYPE . Применяется к любому элементу класса.
Аннотация будет наследоваться дочерним классом (по умолчанию аннотации не наследуются). Применима только к описаниям классов.
Указывает, что аннотация повторяющаяся.
Повторяющиеся аннотации
Определение
Аннотации, которые могут применяться к одному и тому же элементу более одного раза.
Пример
Допустим, вам надо написать аннотацию, запускающую метод в заданное время или по определенному расписанию. В примере созданная аннотация @Schedule будет запускать метод каждый последний день месяца и каждую пятницу в 23:00.
@Schedule(dayOfMonth="last") @Schedule(dayOfWeek="Fri", hour="23") public void doPeriodicCleanup()
Создание повторяющейся аннотации
Для обеспечения обратной совместимости повторяющиеся аннотации хранятся в контейнере аннотаций, который автоматически генерируется java компилятором. Для генерации нужны следующие описания:
Аннотация должна быть помечена @Repeatable, в скобках указан тип контейнера аннотаций.
import java.lang.annotation.Repeatable; @Repeatable(Schedules.class) public @interface Schedule
Контейнер должен содержать массив повторяющихся аннотаций.
public @interface Schedules
Получение повторяющихся аннотаций
Reflection API предоставляет методы для получения аннотаций. При получении повторяющихся аннотаций поведение методов, которые возвращают одну аннотацию (например, AnnotatedElement.getAnnotation(Class) ) не меняется. Если нужно вернуть более одной, то необходимо сначала получить контейнер. Таким образом устаревший код продолжает работать. Также, для получения повторяющихся аннотаций можно использовать методы Java SE 8 (‘AnnotatedElement.getAnnotationsByType(Class)’).
Для получения информации о всех методах, обратитесь к документации класса AnnotatedElement.
Аннотации типов
Определение
Аннотации типов — аннотации, которые применяются вместе с типами. Везде, где вы видите тип, можно использовать эту аннотацию. Например, с оператором new, при приведении, при имплементации и при использовании throws.
Создание аннотации типов
Для создания аннотации типов в @Target указываются следующие значения, либо одно из них:
@Target () public @interface Test
TYPE_PARAMETER , означает, что аннотацию можно применять к переменным типа (например, MyClass ). TYPE_USE , разрешает применение с любыми типами.
Применение
Аннотации типов предназначены для улучшенного анализа программ и более строгой проверки типов. Например, @NonNull String str; . Java SE8 определяет аннотации типов, но не реализует. Вместо этого предлагается использовать сторонние фреймворки, реализующие их (Checker Framework).
Metadata in Java
Metadata in Java, defined as the data about the data, is called “Metadata”. Metadata is also said to be documentation about the information required by the users. This is one of the essential aspects in the case of data warehousing.
Real-Time Examples: A library catalog, the table of content, data items about person data (person weight, a person walking, etc.), etc.
Metadata Consisting of the following things:
- The description and location of the system and its components.
- It also has the Names, definitions, content, and structures of data and end-user views.
- Identification of authoritative data.
- Integration and transformation rules are used to populate data.
- Subscription information of subscribers.
- Used to analyze data usage and performance.
Why is Metadata Necessary?
It gives the Java developers information about the contents like table data, library catalog, etc., and structures.
Types of Metadata
There are 3 types of metadata:
- Operational Metadata
- Extraction and Transformation Metadata
- End-User Metadata
1. Operational Metadata: Operational metadata has all the information of the operational data sources. While selecting information from the source system for Datawarehouse, we will divide the records, combine the factors of documents from various sources, and deal with multiple coding schemes and field lengths. While we deliver the information to end-users, then we must be able to get back to source data sets.
2. Extraction and Transformation Metadata: Extraction and Transformation Metadata include data about removing data from the source systems. Those extraction methods, frequencies, and business rules for data extraction belong to Extraction and Transformation Metadata.
3. End-User Metadata: The end-user metadata is the navigational map of the data house. It enables the end-users to find the data from the data warehouse.
How does Metadata work in Java?
Java Metadata works based on data provided to it. It gives information of data about the data.
class Metadata< public static void main(String args[])< try< //load required database class //creating database metadata class DatabaseMetaData metaData=con.getMetaData(); //display the metadata of the table content System.out.println(metaData.getDriverName()); System.out.println(metaData.getDriverVersion()); System.out.println(metaData.getUserName()); System.out.println(metaData.getDatabaseProductName()); System.out.println(metaData.getDatabaseProductVersion()); con.close(); >catch(Exception e) < System.out.println(e);>> >
Note: Before getting into the example, you must need MySQL database and mysql-connector jar.
Examples to Implement Metadata in Java
Below are examples of Metadata in Java:
Example #1 – Result Set Metadata
import java.sql.*;//importing sql package public class A/Creating class //main method for run the application public static void main(String args[]) < try < //loading my sql driver Class.forName("com.mysql.jdbc.Driver"); //get the connection by providing database, user name and password Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root"); //select the all from employee table PreparedStatement preparedStatement = connection.prepareStatement("select * from employee"); //executing the query ResultSet resultSet = preparedStatement.executeQuery(); //Create result meta data for get the meta data of table ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); //Displaying meta data of employee table System.out.println("Total Number of columns: " + resultSetMetaData.getColumnCount()); System.out.println("1st Column name : " + resultSetMetaData.getColumnName(1)); System.out.println("2nd Column name : " + resultSetMetaData.getColumnName(2)); System.out.println("3rd Column name : " + resultSetMetaData.getColumnName(3)); System.out.println("Column Type Name of 1st column: " + resultSetMetaData.getColumnTypeName(1)); System.out.println("Column Type Name of 2nd column: " + resultSetMetaData.getColumnTypeName(2)); System.out.println("Column Type Name of 3rd column: " + resultSetMetaData.getColumnTypeName(3)); connection.close(); > catch (Exception e) < System.out.println(e); >> >
Example #2 – Database Metadata
import java.sql.*;//importing sql package public class A/Creating class //main method for run the application public static void main(String args[]) < try < //loading my sql driver Class.forName("com.mysql.jdbc.Driver"); //get the connection by providing database, user name and password Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root", "root"); //select the all from employee table PreparedStatement preparedStatement = connection.prepareStatement("select * from employee"); //executing the query preparedStatement.executeQuery(); //Create databse result set meta data for get the meta data of databse of mysql DatabaseMetaData databaseMetaData=connection.getMetaData(); //Displaying meta data of mysql table System.out.println("MYSQL Driver Name: "+databaseMetaData.getDriverName()); System.out.println("MYSQL Driver Version: "+databaseMetaData.getDriverVersion()); System.out.println("MYSQL UserName: "+databaseMetaData.getUserName()); System.out.println("MYSQL Database Product Name:"+databaseMetaData.getDatabaseProductName()); System.out.println("MYSQL Database Product Version: "+databaseMetaData.getDatabaseProductVersion()); connection.close(); > catch (Exception e) < System.out.println(e); >> >
Example #3 – Database Metadata for Extracting Table Names
import java.sql.*;//importing sql package public class A/ Creating class // main method for run the application public static void main(String args[]) < try < // loading my sql driver Class.forName("com.mysql.jdbc.Driver"); // get the connection by providing database, user name and password Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root"); // Create databse result set meta data for get the meta data of // databse of mysql DatabaseMetaData dbmd = connection.getMetaData(); String table[] = < "VIEW" > ; ResultSet resultSet = dbmd.getTables(null, null, null, table); // iterating number table names from database of mysql while (resultSet.next()) < System.out.println("Table name is: "+resultSet.getString(3)); >connection.close(); > catch (Exception e) < System.out.println(e); >> >
Conclusion
Metadata in Java is used to know the data about data. It means, for example, table field names, field data type, field data type length, database table names, number of databases that existed in the specific database, etc.
Recommended Articles
We hope that this EDUCBA information on “Metadata in Java” was beneficial to you. You can view EDUCBA’s recommended articles for more information.
89+ Hours of HD Videos
13 Courses
3 Mock Tests & Quizzes
Verifiable Certificate of Completion
Lifetime Access
4.5
97+ Hours of HD Videos
15 Courses
12 Mock Tests & Quizzes
Verifiable Certificate of Completion
Lifetime Access
4.5
JAVA Course Bundle — 78 Courses in 1 | 15 Mock Tests
416+ Hours of HD Videos
78 Courses
15 Mock Tests & Quizzes
Verifiable Certificate of Completion
Lifetime Access
4.8