- java.lang.reflect.Field.getAnnotation() Method Example
- Declaration
- Parameters
- Returns
- Exceptions
- Example
- Class Field
- Field Summary
- Fields declared in interface java.lang.reflect.Member
- Method Summary
- Methods declared in class java.lang.reflect.AccessibleObject
- Methods declared in class java.lang.Object
- Method Details
- setAccessible
- getDeclaringClass
- getName
- getModifiers
- isEnumConstant
- isSynthetic
- getType
- getGenericType
- equals
- hashCode
- toString
- toGenericString
- get
- getBoolean
- Полное руководство по Java Reflection API. Рефлексия на примерах
- Java Reflection API
- Ограничения при работе с рефлексией в Java
- Java Reflection: Работа с классами
java.lang.reflect.Field.getAnnotation() Method Example
The java.lang.reflect.Field.getAnnotation(Class annotationClass) method returns this element’s annotation for the specified type if such an annotation is present, else null.
Declaration
Following is the declaration for java.lang.reflect.Field.getAnnotation(Class annotationClass) method.
public T getAnnotation(Class annotationClass)
Parameters
annotationClass − the Class object corresponding to the annotation type.
Returns
this element’s annotation for the specified annotation type if present on this element, else null.
Exceptions
NullPointerException − if the given annotation class is null.
Example
The following example shows the usage of java.lang.reflect.Field.getAnnotation(Class annotationClass) method.
package com.tutorialspoint; import java.lang.annotation.Annotation; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.reflect.Field; public class FieldDemo < public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException < Field field = SampleClass.class.getField("sampleField"); Annotation annotation = field.getAnnotation(CustomAnnotation.class); if(annotation instanceof CustomAnnotation)< CustomAnnotation customAnnotation = (CustomAnnotation) annotation; System.out.println("name: " + customAnnotation.name()); System.out.println("value: " + customAnnotation.value()); >> > @CustomAnnotation(name = «SampleClass», value = «Sample Class Annotation») class SampleClass < @CustomAnnotation(name="sampleClassField", value = "Sample Field Annotation") public String sampleField; public String getSampleField() < return sampleField; >public void setSampleField(String sampleField) < this.sampleField = sampleField; >> @Retention(RetentionPolicy.RUNTIME) @interface CustomAnnotation
Let us compile and run the above program, this will produce the following result −
name: sampleClassField value: Sample Field Annotation
Class Field
A Field provides information about, and dynamic access to, a single field of a class or an interface. The reflected field may be a class (static) field or an instance field.
A Field permits widening conversions to occur during a get or set access operation, but throws an IllegalArgumentException if a narrowing conversion would occur.
Field Summary
Fields declared in interface java.lang.reflect.Member
Method Summary
Returns an AnnotatedType object that represents the use of a type to specify the declared type of the field represented by this Field.
Returns this element’s annotation for the specified type if such an annotation is present, else null.
Gets the value of a static or instance field of type char or of another primitive type convertible to type char via a widening conversion.
Returns the Class object representing the class or interface that declares the field represented by this Field object.
Gets the value of a static or instance field of type double or of another primitive type convertible to type double via a widening conversion.
Gets the value of a static or instance field of type float or of another primitive type convertible to type float via a widening conversion.
Returns a Type object that represents the declared type for the field represented by this Field object.
Gets the value of a static or instance field of type int or of another primitive type convertible to type int via a widening conversion.
Gets the value of a static or instance field of type long or of another primitive type convertible to type long via a widening conversion.
Gets the value of a static or instance field of type short or of another primitive type convertible to type short via a widening conversion.
Returns a Class object that identifies the declared type for the field represented by this Field object.
Sets the field represented by this Field object on the specified object argument to the specified new value.
Methods declared in class java.lang.reflect.AccessibleObject
Methods declared in class java.lang.Object
Method Details
setAccessible
- C and D are in the same module.
- The member is public and D is public in a package that the module containing D exports to at least the module containing C .
- The member is protected static , D is public in a package that the module containing D exports to at least the module containing C , and C is a subclass of D .
- D is in a package that the module containing D opens to at least the module containing C . All packages in unnamed and open modules are open to all modules and so this method always succeeds when D is in an unnamed or open module.
This method cannot be used to enable access to private members, members with default (package) access, protected instance members, or protected constructors when the declaring class is in a different module to the caller and the package containing the declaring class is not open to the caller’s module.
- static final fields declared in any class or interface
- final fields declared in a hidden class
- final fields declared in a record
The accessible flag when true suppresses Java language access control checks to only enable read access to these non-modifiable final fields.
If there is a security manager, its checkPermission method is first called with a ReflectPermission(«suppressAccessChecks») permission.
getDeclaringClass
Returns the Class object representing the class or interface that declares the field represented by this Field object.
getName
getModifiers
Returns the Java language modifiers for the field represented by this Field object, as an integer. The Modifier class should be used to decode the modifiers.
isEnumConstant
isSynthetic
getType
Returns a Class object that identifies the declared type for the field represented by this Field object.
getGenericType
Returns a Type object that represents the declared type for the field represented by this Field object. If the declared type of the field is a parameterized type, the Type object returned must accurately reflect the actual type arguments used in the source code. If the type of the underlying field is a type variable or a parameterized type, it is created. Otherwise, it is resolved.
equals
Compares this Field against the specified object. Returns true if the objects are the same. Two Field objects are the same if they were declared by the same class and have the same name and type.
hashCode
Returns a hashcode for this Field . This is computed as the exclusive-or of the hashcodes for the underlying field’s declaring class name and its name.
toString
Returns a string describing this Field . The format is the access modifiers for the field, if any, followed by the field type, followed by a space, followed by the fully-qualified name of the class declaring the field, followed by a period, followed by the name of the field. For example:
public static final int java.lang.Thread.MIN_PRIORITY private int java.io.FileDescriptor.fd
The modifiers are placed in canonical order as specified by «The Java Language Specification». This is public , protected or private first, and then other modifiers in the following order: static , final , transient , volatile .
toGenericString
Returns a string describing this Field , including its generic type. The format is the access modifiers for the field, if any, followed by the generic field type, followed by a space, followed by the fully-qualified name of the class declaring the field, followed by a period, followed by the name of the field. The modifiers are placed in canonical order as specified by «The Java Language Specification». This is public , protected or private first, and then other modifiers in the following order: static , final , transient , volatile .
get
Returns the value of the field represented by this Field , on the specified object. The value is automatically wrapped in an object if it has a primitive type. The underlying field’s value is obtained as follows: If the underlying field is a static field, the obj argument is ignored; it may be null. Otherwise, the underlying field is an instance field. If the specified obj argument is null, the method throws a NullPointerException . If the specified object is not an instance of the class or interface declaring the underlying field, the method throws an IllegalArgumentException . If this Field object is enforcing Java language access control, and the underlying field is inaccessible, the method throws an IllegalAccessException . If the underlying field is static, the class that declared the field is initialized if it has not already been initialized. Otherwise, the value is retrieved from the underlying instance or static field. If the field has a primitive type, the value is wrapped in an object before being returned, otherwise it is returned as is. If the field is hidden in the type of obj , the field’s value is obtained according to the preceding rules.
getBoolean
Полное руководство по Java Reflection API. Рефлексия на примерах
В этой статье мы познакомимся со всеми элементами и функциональными возможностями Java Reflection API.
Рефлексия в Java — это механизм, с помощью которого можно вносить изменения и получать информацию о классах, интерфейсах, полях и методах во время выполнения, при этом не зная имен этих классов, методов и полей. Кроме того, Reflection API дает возможность создавать новые экземпляры классов, вызывать методы, а также получать или устанавливать значения полей.
Начинающие Java-программисты часто путают рефлексию с интроспекцией. Интроспекция — проверка кода и возможность видеть типы объектов во время выполнения. Рефлексия дает возможность вносить изменения во время выполнения программы путем использования интроспекции. Здесь важно понимать различие, поскольку некоторые языки поддерживают интроспекцию, но не поддерживают рефлексию, например, C++.
В этом руководстве мы рассмотрим не только базовые, но и более продвинутые возможности Reflection API.
Java Reflection API
Рефлексия — мощная концепция, которая лежит в основе большинства современных Java/Java EE фреймворков и библиотек. Например, для Java классическими примерами являются:
- JUnit – фреймворк для модульного тестирования. Он использует рефлексию для парсинга аннотаций (например, @Test ) для получения описанных программистом тестовых методов и дальнейшего их выполнения.
- Spring – фреймворк для разработки приложений на Java платформе, в основе которого лежит внедрение зависимостей (инверсия управления).
Список можно продолжать бесконечно: от веб-контейнеров до решения задач объектно-реляционного отображения (ORM). Их всех объединяет одно: они используют Java рефлексию, потому что не имеют доступа и представления к определенных пользователем классах, методах, интерфейсах и т.д.
Ограничения при работе с рефлексией в Java
Почему мы не должны использовать рефлексию в обычном программировании, когда уже есть доступ к интерфейсам и классам. Причин несколько:
- Низкая производительность — поскольку рефлексия в Java определяет типы динамически, то она сканирует classpath, чтобы найти класс для загрузки, в результате чего снижается производительность программы.
- Ограничения системы безопасности — рефлексия требует разрешения времени выполнения, которые не могут быть доступны для систем, работающих под управлением менеджера безопасности (Java Security Manager).
- Нарушения безопасностиприложения — с помощью рефлексии мы можем получить доступ к части кода, к которой мы не должны получать доступ. Например, мы можем получить доступ к закрытым полям класса и менять их значения. Это может быть серьезной угрозой безопасности.
- Сложность в поддержке — код, написанный с помощью рефлексии трудно читать и отлаживать, что делает его менее гибким и трудно поддерживаемым.
Java Reflection: Работа с классами
Объект java.lang.Class является точкой входа для всех операций рефлексии. Для каждого типа объекта, JVM создает неизменяемый экземпляр java.lang.Class который предоставляет методы для получения свойств объекта, создания новых объектов, вызова методов.
В этом разделе мы рассмотрим важные методы при работе с java.lang.Class :
- Все типы в Java, включая примитивные типы и массивы имеют связанный с ними java.lang.Class объект. Если мы знаем название класса во время компиляции, то сможем получить объект следующим образом: