跳至主要內容

注解与反射

LincZero大约 4 分钟

注解与反射

注解和反射是框架 (myboost springboot) 的底层

  • 参考:https://www.bilibili.com/video/BV1p4411P7V3(进度:p7 end)

CONTENTS

注解 Java.Annotation

注解使用

注解入门

  • JDK 5.0 引入的新技术
  • 注解和注释区别
    • 注释 (Comment) 给人看的
    • 注解 (Annotation) 是还能给程序看的
  • 作用
    • 不是程序本身,可以对程序作出解释(这一点和注释(comment)没什么区别)
    • 可以被其他程序 (比如编译器等) 读取
  • 格式
    • @注释名 在代码中存在,还可以添加一些参数值,例如:@SuppressWarnings(value="unchecked")
  • 在哪里使用
    • 可以附加在package、class、method、field等上面,相当于给他们添加了额外的辅助信息 我们可以通过反射机制编程实现对这些元数据的访问

内置注解

@Override
	// 定义在java.lang.Override中,此注释只适用于修辞方法﹐表示一个方法声明打算重写超类中的另一个方法声明

@Deprecated
	// 定义在java.lang.Deprecated中,此注释可以用于修辞方法﹐属性,类,表示不鼓励程序员使用这样的元素﹐通常是因为它很危险或者存在更好的选择

@SuppressWarnings
	// 定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息
	// 与前两个注释有所不同,你需要添加一个参数才能正确使用,这些参数都是已经定义好了的,我们选择性的使用就好了
	@SuppressWarnings("all")
	@SuppressWarnings("unchecked")
	@SuppressWarnings(value="unchecked","deprecation"})
	等等........

举例

public class Test01 extend Object {
    @Override // 重写的注解,可以检查,如果下面是tostring,则会报错。有点类似于C++后面更新的override关键字
    public String toString() {
        Thread
        return super.toString();
    }
    
    @Deprecated // 不推荐程序员使用,但是可以使用。你使用时会有个删除线的格式
    public void test() {
        System.out.println("Deprecated")
    }
    
    @SuppressWarnings("all") // 抑制住警告,这里all移植所有警告
    public void test02() {
        List list = new ArrayList();
    }
}

元注解

  • 作用

    • 负责注解其他注解,Java定义了4个标准的meta-annotation类型,他们被用来提供对其他annotation类型作说明.
  • 这些类型和它们所支持的类在java.lang.annotation包中可以找到。如下

    @Target
    	用于描述注解的使用范围 (: 被描述的注解可以用在什么地方)
    
    @Retention
    	表示需要在什么级别保存该注释信息﹐用于描述注解的生命周期 (SOURCE< CLASS< RUNTIME)
    
    @Document
    	说明该注解将被包含在javadoc中
    
    @Inherited
    	说明子类可以继承父类中的该注解
    

测试元注解

// 测试元注解
@MyAnnotation
public class Test02 {
    public void test(){
        
    }
}

// 定义一个注解
// Target 表示我们的注解可以用在什么地方。这里被用于方法上和类上面
@Target(value={ElementType.METHOD, ElementType.TYPE})
// Retention 表示我们的注解在什么地方还有效。runtime>class>soureces
@Retention(value=RetentionPolicy.RUNTIME)
// Documented 表示是否将我们的注解生成在JAVAdoc中
@Documented
// Inherited 子类可以继承父类的注解
@Inherited
@interface MyAnnotation {
    
}

自定义注解

  • 使足@interface自定义注解时﹐自动继承了java.lang.annotation.Annotation接口
  • 分析:
    • interface用来声明一个注解﹐格式: public @interface注解名
    • 其中的每一个方法实际上是声明了一个配置参数
    • 方法的名称就是参数的名称
    • 返回值类型就是参数的类型(返回值只能是基本类型 , Class , String , enum)
    • 可以通过default来声明参数的默认值
    • 如果只有一个参数成员,一般参数名为value
    • 注解元素必须要有值,我们定义注解元素时,经常使用空字符串,0作为默认值
// 自定义注解
public class Test03 {
    @MyAnnotation2(name = "秦疆")
    public void test(){}
    
    @MyAnnotation3("秦疆")
    public void test2(){}
}

// 定义一个注解
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(value=RetentionPolicy.RUNTIME)
@interfae MyAnnotation2{
    // 注解的参数:参数类型 + 参数名()。注意这不是一个方法
    String name() default "";
    int age() default 0;
    int id() default -1; // 如果默认值为-1,代表不存在
    
    String[] schools() default {"清华大学", "西北大学"};
}

// 定义一个注解
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(value=RetentionPolicy.RUNTIME)
@interfae MyAnnotation3{
    // 如果只有一个值,建议用value命名。只有为value时才能不指定命名直接传参
    String value();
}