💗wei_shuo的个人主页
💫wei_shuo的学习社区
🌐Hello World !
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");
🌼 结语:创作不易,如果觉得博主的文章赏心悦目,还请——
点赞
👍收藏
⭐️评论
📝