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");
🌼 结语:创作不易,如果觉得博主的文章赏心悦目,还请——
点赞
👍收藏
⭐️评论
📝