Spring 注解是如何实现的

947 阅读3分钟
原文链接: gitchat.csdn.net

一、Java 反射

1. 反射是什么?

反射对于 Java 程序员来说算是一种高级的特性了,像类的热加载、动态代理等都是通过反射来实现的。基本上对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。

2. 注解作用

简单一点说,Class 类可以看做是所有类的元数据类(JDK 对此类的解释为 Class 类代表了正在运行的 Java 程序中的类和接口),而我们又知道方法区是用来存放已经被加载的类的信息、常量、字段、方法等信息,所以说给人最直观的一个感受就是 Class 类可以间接的与方法区对应起来,具体是如何对应以及是如何操作的,感兴趣的小伙伴可以自行研究。

3. 反射的简单使用

 public class TestReflect {
        private String nameTest;

        public static void main(String[] args) throws IllegalAccessException, InstantiationException {
            TestReflect testReflect=new TestReflect();
            System.out.println(testReflect.getClass().getName());
            //获取属性
            Field[] fields = testReflect.getClass().getDeclaredFields();
            for (Field field : fields) {
                System.out.println(field.getName());
            }
        }
    }

输出结果:

xmht.reflect.TestReflect
nameTest

还有好多,比如可以获取类的所有方法,对象的所有属性等等,期待你的挖掘。

二、Java 注解

1. 注解是什么?

其实 Java 的注解还是特别常见的,像平时用到的 @Override、@Deprecated 等都是注解的一种表现方式。

对于注解官方解释:为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后的某个时刻非常方便地使用这些数据。

2. 注解作用

可以书写更加干净易读的代码,简化重复的工作,比如 Spring 的注解;

另外还提供编译期类型检查,比如 @Override 当方法签名对不上覆盖的方法时,编译器就会发出错误提示:

  • 编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码
  • 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例
  • 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例

3. 注解分类

注解名字

注解类型

注解作用

@Override

标准注解

表示当前的方法覆盖自父类方法。如果不小心拼写错误或者方法签名对不上,编译器就会报错

@Deprecated

标准注解

表示此方法已经失效,将在未来版本中删除

@SuppressWarnings

标准注解

关闭编译器的警告信息

@Target

元注解

表示该注解用于什么地方。CONSTRUCTOR:构造器声明 FIELD:域声明(包括enum实例) LOCAL_VARIABLE:局部变量声明 METHOD:方法声明 PACKAGE:包声明 PARAMETER:参数声明 TYPE:类、接口(包括注解类)或者enum声明

@Retention

元注解

表示需要在什么级别保存该注解信息。SOURCE:注解将被编译器丢弃 CLASS:注解在class