StandardAnnotationMetadata.from具有什么功能呢?
下文笔者讲述StandardAnnotationMetadata.from方法的功能简介说明,如下所示
StandardAnnotationMetadata.from方法简介
`StandardAnnotationMetadata`是Spring框架中的一个类 用于提供对注解元数据的访问。 `StandardAnnotationMetadata.from`方法是该类中的一个静态工厂方法, 用于从给定的类或注解创建`StandardAnnotationMetadata`实例
`StandardAnnotationMetadata.from`方法的功能
1.创建`StandardAnnotationMetadata`实例: 从给定的类或注解创建一个`StandardAnnotationMetadata`对象 以便访问该类或注解上的所有注解信息 2.提供注解元数据: 允许开发者获取类或注解上的注解类型、 属性值等信息 用于进一步处理和配置
StandardAnnotationMetadata.from不同方法简介
方法1:从类创建 `StandardAnnotationMetadata` public static StandardAnnotationMetadata from(Class<?> introspectedClass) - 参数: -`introspectedClass`: 需要获取注解元数据的类 - 返回值: -`StandardAnnotationMetadata`: 包含类上注解信息 `StandardAnnotationMetadata`实例 方法2:从注解创建`StandardAnnotationMetadata` public static StandardAnnotationMetadata from(Annotation annotation) - 参数: -`annotation`:需要获取注解元数据的注解实例。 - 返回值: - `StandardAnnotationMetadata`: 包含注解信息的 `StandardAnnotationMetadata` 实例。
StandardAnnotationMetadata使用场景
`StandardAnnotationMetadata`主要用于以下场景: -注解处理: 在Spring注解配置机制中 用于解析和处理类上的注解。 -自定义注解处理器: 在自定义注解处理器中 用于获取和处理注解信息。 -元数据访问: 在需要访问类或注解的元数据信息时 提供一个统一的接口。例
1:从类创建 `StandardAnnotationMetadata` 一个类 `MyComponent` 使用`@Component`注解 import org.springframework.stereotype.Component; @Component public class MyComponent { // 类内容 } 使用 `StandardAnnotationMetadata.from` 方法 从`MyComponent`类 创建`StandardAnnotationMetadata`实例 并访问注解信息 import org.springframework.core.type.StandardAnnotationMetadata; import org.springframework.stereotype.Component; public class StandardAnnotationMetadataExample { public static void main(String[] args) { // 从类创建 StandardAnnotationMetadata 实例 StandardAnnotationMetadata metadata = StandardAnnotationMetadata.from(MyComponent.class); // 检查是否存在 @Component 注解 if (metadata.hasAnnotation(Component.class.getName())) { System.out.println("MyComponent 类上有 @Component 注解"); } // 获取注解属性值 String componentValue = metadata.getAnnotationAttributes(Component.class.getName()).get("value").toString(); System.out.println("Component 注解的 value 属性值: " + componentValue); } } ===========输出============= MyComponent 类上有 @Component 注解 Component 注解的 value 属性值:
例2:从注解创建`StandardAnnotationMetadata`
有一个自定义注解`MyCustomAnnotation` 并有一个类`MyAnnotatedClass`使用该注解 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.Runtime) public @interface MyCustomAnnotation { String value() default ""; } @MyCustomAnnotation(value = "MyValue") public class MyAnnotatedClass { // 类内容 } 使用`StandardAnnotationMetadata.from`方法 从`MyCustomAnnotation`注解 创建`StandardAnnotationMetadata`实例 并访问注解信息 import org.springframework.core.type.StandardAnnotationMetadata; import org.springframework.core.type.AnnotationMetadata; import java.lang.annotation.Annotation; public class StandardAnnotationMetadataExample { public static void main(String[] args) { // 获取 MyAnnotatedClass 类上的 MyCustomAnnotation 注解 MyCustomAnnotation annotation = MyAnnotatedClass.class.getAnnotation(MyCustomAnnotation.class); // 从注解创建 StandardAnnotationMetadata 实例 StandardAnnotationMetadata metadata = StandardAnnotationMetadata.from(annotation); // 检查是否存在 MyCustomAnnotation 注解 if (metadata.hasAnnotation(MyCustomAnnotation.class.getName())) { System.out.println("MyAnnotatedClass 类上有 MyCustomAnnotation 注解"); } // 获取注解属性值 String annotationValue = metadata.getAnnotationAttributes(MyCustomAnnotation.class.getName()).get("value").toString(); System.out.println("MyCustomAnnotation 注解的 value 属性值: " + annotationValue); } } ==============输出=============== MyAnnotatedClass 类上有 MyCustomAnnotation 注解 MyCustomAnnotation 注解的 value 属性值: MyValue
StandardAnnotationMetadata中核心方法
`StandardAnnotationMetadata` 提供许多方法来访问和操作注解元数据 以下是一些常用的方法: (1).`hasAnnotation(String annotationName)` -作用:检查指定的注解是否存在。 -参数: - `annotationName`:注解的全限定名。 -返回值: - `boolean`:如果存在指定的注解,则返回`true`,否则返回`false` (2).`getAnnotationAttributes(String annotationName)` -作用:获取指定注解的所有属性值 -参数: -`annotationName`: 注解的全限定名 -返回值: - `Map<String, Object>`: 包含注解属性名称和值的映射 (3).`getAnnotationTypes()` -作用:获取所有注解的全限定名 -返回值: -`Set<String>`: 包含所有注解全限定名的集合 (4).`getClassName()` -作用:获取被注解的类的全限定名 -返回值: -`String`:类的全限定名
StandardAnnotationMetadata内部使用
`StandardAnnotationMetadata` 内部使用 `AnnotationUtils` 和 `AnnotationAttributes` 来解析和存储注解信息 import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.type.AnnotationMetadata; import java.lang.annotation.Annotation; import java.util.Map; import java.util.Set; public class StandardAnnotationMetadata implements AnnotationMetadata { private final Class<?> introspectedClass; private final boolean nestedAnnotationsAsMap; public StandardAnnotationMetadata(Class<?> introspectedClass, boolean nestedAnnotationsAsMap) { this.introspectedClass = introspectedClass; this.nestedAnnotationsAsMap = nestedAnnotationsAsMap; } @Override public Set<String> getAnnotationTypes() { return AnnotationUtils.getAnnotationTypes(this.introspectedClass); } @Override public boolean hasAnnotation(String annotationName) { return AnnotationUtils. findAnnotation(this.introspectedClass, annotationName) != null; } @Override public Map<String, Object> getAnnotationAttributes(String annotationName) { return AnnotationUtils. getAnnotationAttributes(this.introspectedClass, annotationName, this.nestedAnnotationsAsMap, true); } @Override public String getClassName() { return this.introspectedClass.getName(); } // 其他方法实现... public static StandardAnnotationMetadata from(Class<?> introspectedClass) { return new StandardAnnotationMetadata(introspectedClass, false); } public static StandardAnnotationMetadata from(Annotation annotation) { return new StandardAnnotationMetadata(annotation, false); } }
StandardAnnotationMetadata注意事项
-性能考虑: -创建`StandardAnnotationMetadata`实例时 会解析类或注解上的所有注解信息 因此在性能敏感的场景中需要谨慎使用 - 注解保留策略: -确保注解的保留策略(`RetentionPolicy`)设置为`RUNTIME` 否则在运行时无法通过反射获取注解信息 -嵌套注解: -`StandardAnnotationMetadata`支持嵌套注解的解析 可通过 `nestedAnnotationsAsMap`参数控制嵌套注解的处理方式例
import org.springframework.core.type.StandardAnnotationMetadata; import org.springframework.stereotype.Component; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.Map; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface MyCustomAnnotation { String value() default ""; } @Component @MyCustomAnnotation(value = "MyValue") public class MyAnnotatedClass { // 类内容 } public class StandardAnnotationMetadataExample { public static void main(String[] args) { // 示例 1: 从类创建 StandardAnnotationMetadata 实例 StandardAnnotationMetadata metadataFromClass = StandardAnnotationMetadata.from(MyAnnotatedClass.class); // 检查是否存在 @Component 注解 if (metadataFromClass.hasAnnotation(Component.class.getName())) { System.out.println("MyAnnotatedClass 类上有 @Component 注解"); } // 获取 @Component 注解的 value 属性值 Map<String, Object> componentAttributes = metadataFromClass.getAnnotationAttributes(Component.class.getName()); String componentValue = componentAttributes.get("value").toString(); System.out.println("@Component 注解的 value 属性值: " + componentValue); // 示例 2: 从注解创建 StandardAnnotationMetadata 实例 MyCustomAnnotation annotation = MyAnnotatedClass.class.getAnnotation(MyCustomAnnotation.class); StandardAnnotationMetadata metadataFromAnnotation = StandardAnnotationMetadata.from(annotation); // 检查是否存在 MyCustomAnnotation 注解 if (metadataFromAnnotation.hasAnnotation(MyCustomAnnotation.class.getName())) { System.out.println("MyAnnotatedClass 类上有 MyCustomAnnotation 注解"); } // 获取 MyCustomAnnotation 注解的 value 属性值 Map<String, Object> customAnnotationAttributes = metadataFromAnnotation.getAnnotationAttributes(MyCustomAnnotation.class.getName()); String customAnnotationValue = customAnnotationAttributes.get("value").toString(); System.out.println("MyCustomAnnotation 注解的 value 属性值: " + customAnnotationValue); } } ========================输出============================== MyAnnotatedClass 类上有 @Component 注解 @Component 注解的 value 属性值: MyAnnotatedClass 类上有 MyCustomAnnotation 注解 MyCustomAnnotation 注解的 value 属性值: MyValue
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。