Java注解与反射

简介: Java注解与反射


Java注解与反射

Java注解和反射是Java语言中两个强大的特性,它们可以一起使用以实现动态的、灵活的编程和元数据处理

注解

Java注解(Annotations)是一种元数据,它提供了对代码的额外信息和标记。注解可以用于类、方法、字段和其他程序元素,用于提供编译时和运行时的信息。注解以@符号开头,放置在目标元素的前面

内置注解

@Override

@Override:用于标注方法,表示该方法覆盖了父类中的方法

@SuppressWarnings

@SuppressWarnings:抑制编译器产生的警告

@FunctionalInterface

@FunctionalInterface:标记接口为函数式接口,即只包含一个抽象方法的接口

@SafeVarargs

@SafeVarargs:用于标记可变参数方法是类型安全的

@Nullable

@Nullable:标记方法参数、字段或返回值可以为null

@NonNull

@NonNull:标记方法参数、字段或返回值不可为null

@Repeatable

@Repeatable:用于标记注解类型,表示该注解可以在同一个元素上重复使用

元注解

元注解(meta-annotation)是指用于注解其他注解的特殊注解;元注解在Java中用于对其他注解进行修饰和配置,从而改变其行为或提供额外的信息

元注解四大类型

@Target

指定了注解的目标元素,即注解可以应用于哪些Java元素,如类、方法、字段等

应用于类
@Target(ElementType.TYPE)
public @interface MyAnnotation {
    // ...
}
应用于方法
@Target(ElementType.METHOD)
public @interface MyAnnotation {
    // ...
}
应用于字段
@Target(ElementType.FIELD)
public @interface MyAnnotation {
    // ...
}
应用于参数
@Target(ElementType.PARAMETER)
public @interface MyAnnotation {
    // ...
}
应用于构造方法
@Target(ElementType.CONSTRUCTOR)
public @interface MyAnnotation {
    // ...
}
应用于局部变量
@Target(ElementType.LOCAL_VARIABLE)
public @interface MyAnnotation {
    // ...
}
应用于注解类型
@Target(ElementType.ANNOTATION_TYPE)
public @interface MyAnnotation {
    // ...
}
@Retention

指定了注解的保留策略,即注解在编译时、类加载时还是运行时可见

源码级别可见
@Retention(RetentionPolicy.SOURCE)
public @interface MyAnnotation {
    // ...
}
编译时可见
@Retention(RetentionPolicy.CLASS)
public @interface MyAnnotation {
    // ...
}
运行时可见
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    // ...
}
@Documented

指定注解是否会出现在生成的Java文档中

@Documented
public @interface MyAnnotation {
    // ...
}
@Inherited

指示注解是否具有继承性,即注解是否可以被子类继承

@Inherited
public @interface MyAnnotation {
    // ...
}

自定义注解

自定义注解是在 Java 中定义的一种元数据,用于给程序元素(类、方法、字段等)添加额外的信息和属性;通过自定义注解,开发人员可以在程序中添加自己定义的元数据,以便在运行时使用反射获取这些注解并进行特定的处理

  • 定义注解
public @interface MyAnnotation {
    String value() default ""; // 注解属性,可以有默认值
    int count() default 0;
}
  • 使用注解
@MyAnnotation(value = "hello", count = 3)
public class MyClass {
    // ...
}
  • 获取注解元数据
Class<?> clazz = MyClass.class;
MyAnnotation annotation = clazz.getAnnotation(MyAnnotation.class);
String value = annotation.value(); // 获取注解的 value 属性值
int count = annotation.count(); // 获取注解的 count 属性值

反射

反射(Reflection)是Java提供的一种机制,用于在运行时检查、访问和修改类、对象、方法和字段等程序元素;通过反射,我们可以在运行时获取类的信息,创建类的实例,调用类的方法和访问类的字段。反射使得我们可以在运行时动态地操作类和对象,而不需要提前知道它们的具体细节

反射机制核心类

  • Class类:代表一个类的描述信息,通过Class类可以获取类的构造函数、字段、方法、注解等信息
  • Constructor类:代表类的构造函数,通过Constructor类可以创建类的实例
  • Field类:代表类的字段,通过Field类可以获取和设置字段的值
  • Method类:代表类的方法,通过Method类可以调用方法
import java.lang.reflect.Method;
public class ReflectionExample {
    public static void main(String[] args) throws Exception {
        // 获取类的 Class 对象
        Class<?> clazz = MyClass.class;
        // 获取指定方法名的 Method 对象
        Method method = clazz.getDeclaredMethod("myMethod");
        // 创建类的实例
        Object instance = clazz.getDeclaredConstructor().newInstance();
        // 调用方法
        method.invoke(instance);
    }
}
// 定义一个示例类
class MyClass {
    public void myMethod() {
        System.out.println("Hello, reflection!");
    }
}

获取Class类方式

  • 使用类名的.class语法:可以直接使用类名的.class语法来获取一个类的Class对象
Class<?> clazz = MyClass.class;
  • 使用对象的getClass()方法:可以通过一个对象的getClass()方法来获取它所属类的Class对象
MyClass obj = new MyClass();
Class<?> clazz = obj.getClass();
  • 使用Class.forName()方法:可以通过类的全限定名使用Class.forName()方法来获取Class对象
Class<?> clazz = Class.forName("com.example.MyClass");

🌼 结语:创作不易,如果觉得博主的文章赏心悦目,还请——点赞👍收藏⭐️评论📝


目录
相关文章
|
19天前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
56 7
|
2月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
99 43
Java学习十六—掌握注解:让编程更简单
|
24天前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
64 5
|
1月前
|
监控 Java
Java基础——反射
本文介绍了Java反射机制的基本概念和使用方法,包括`Class`类的使用、动态加载类、获取方法和成员变量信息、方法反射操作、以及通过反射了解集合泛型的本质。同时,文章还探讨了动态代理的概念及其应用,通过实例展示了如何利用动态代理实现面向切面编程(AOP),例如为方法执行添加性能监控。
|
1月前
|
Java 开发者 Spring
[Java]自定义注解
本文介绍了Java中的四个元注解(@Target、@Retention、@Documented、@Inherited)及其使用方法,并详细讲解了自定义注解的定义和使用细节。文章还提到了Spring框架中的@AliasFor注解,通过示例帮助读者更好地理解和应用这些注解。文中强调了注解的生命周期、继承性和文档化特性,适合初学者和进阶开发者参考。
60 14
|
1月前
|
前端开发 Java
[Java]讲解@CallerSensitive注解
本文介绍了 `@CallerSensitive` 注解及其作用,通过 `Reflection.getCallerClass()` 方法返回调用方的 Class 对象。文章还详细解释了如何通过配置 VM Options 使自定义类被启动类加载器加载,以识别该注解。涉及的 VM Options 包括 `-Xbootclasspath`、`-Xbootclasspath/a` 和 `-Xbootclasspath/p`。最后,推荐了几篇关于 ClassLoader 的详细文章,供读者进一步学习。
37 12
|
1月前
|
Java
Java的反射
Java的反射。
29 2
|
2月前
|
存储 Java
[Java]反射
本文详细介绍了Java反射机制的基本概念、使用方法及其注意事项。首先解释了反射的定义和类加载过程,接着通过具体示例展示了如何使用反射获取和操作类的构造方法、方法和变量。文章还讨论了反射在类加载、内部类、父类成员访问等方面的特殊行为,并提供了通过反射跳过泛型检查的示例。最后,简要介绍了字面量和符号引用的概念。全文旨在帮助读者深入理解反射机制及其应用场景。
38 0
[Java]反射
|
3月前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
77 9
Java——反射&枚举
|
2月前
|
安全 Java 测试技术
🌟Java零基础-反射:从入门到精通
【10月更文挑战第4天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
31 2