javase-annotation-210710-01

javase-annotation-210710-01

  • 注解解释
  • 元注解
  • Retention源码
  • Target源码

注解解释

1) 注解  也叫注释,Annotation

2) 注解Annotation是一种引用数据类型,编译之后也是生成xxx.class文件

3) 自定义注解,语法如下:
		[修饰符列表] @interface 注解类型名{
		
		}
		
4) 注解如何使用?在哪里使用?
		注解使用语法格式:
			@注解类型名
			
		注解可以出现在类上,属性上,方法上,变量上等
		注解还可以出现在注解类型上。
		
		默认情况下,注解可以出现在任何位置。
		
5) JDK内置的注解
		java.lang包下的注释类型:
			Deprecated 用 @ Deprecated 注释的程序元素
			不鼓励程序员使用这样的元素,通常是因为它很危险或是存在更好的选择
			
			Override 表示一个方法声明打算重写超类中的另一个方法的声明
			
			SuppressWarnings 指示应该在注释元素(以及包含在该注释元素中的所有程序元素)
			中取消显示指定的编译器警告。

@Override

package bgy_annotation_01;
/*
    @Overrid 源码如下:
        @Target(ElementType.METHOD)
        @Retention(RetentionPolicy.SOURCE)
        public @interface Override {
        }

    标示性注解,给编译器做参考
    编译器看到方法上有这个@Overrid注解时,编译器会自动检查该方法是否重写了父类的方法
    如果没用重写,会报错。

    这个注解只是在编译阶段起作用,和运行期无关。

    1. @Overrid 这个注解只能注解方法
    2. @Overrid 这个注解是给编译器参考的,和运行阶段没有关系
    3. 凡是java中的方法带有这个注解的,编译器都会进行编译检查,如果这个方法不是重写父类的方法,编译器报错。

 */

public class AnnotationTest01 {

    @Override
    public String toString(){
        return "toString方法";
    }
}

元注解

什么是元注解?
	元注解就是来标注 “ 注解类型 ” 的 注解
	
常见的元注解
	Target
	Retention

关于Target注解:
	这个一个元注解,用来标注 “ 注解类型 ” 的 注解
	Target 注解用来标注 “被标注的注解”可以出现在哪些位置上。
	
	@Target(ElementType.METHOD)
		表示“被标注的注解”只能出现在方法上
		
关于Retention注解:
	这个一个元注解,用来标注 “ 注解类型 ” 的 注解
	Retention 注解用来标注 “被标注的注解”最终保存在哪里
	
	1. @Retention(RetentionPolicy.SOURCE)
		 表示该注解只被保留在java源文件中。
	2. @Retention(RetentionPolicy.CLASS)
		 表示该注解只被保留在class文件中。
	3. @Retention(RetentionPolicy.RUNTIME)
		 表示该注解只被保留在class文件中,并且可以被反射机制所读取

Retention源码

Retention源码如下:

	@Retention(RetentionPolicy.RUNTIME)
	@Target(ElementType.ANNOTATION_TYPE)
	public @interface Retention {
	    RetentionPolicy value();
	}


RetentionPolicy源码如下:

	public enum RetentionPolicy {
   		SOURCE,			// 表示该注解只被保留在java源文件中。
   		CLASS,			// 表示该注解只被保留在class文件中。
    	RUNTIME  		// 表示该注解只被保留在class文件中,并且可以被反射机制所读取
	}

Target源码

Target源码如下:

	@Retention(RetentionPolicy.RUNTIME)
	@Target(ElementType.ANNOTATION_TYPE)
	public @interface Target {
 	   ElementType[] value();
	}
	
ElementType源码如下:

	public enum ElementType {
	    TYPE,					// 用于描述类、接口(包括注解类型) 或enum声明
	    FIELD,					// 用于描述域
	    METHOD,					// 用于描述方法
	    PARAMETER,				// 用于描述参数
	    CONSTRUCTOR,			// 用于描述构造器
	    LOCAL_VARIABLE,			// 用于描述局部变量
	    ANNOTATION_TYPE,
	    PACKAGE,				// 用于描述包
	    TYPE_PARAMETER,			// 用来标注类型参数
 	    TYPE_USE				// 能标注任何类型名称
	}


@Override理解

AnnotationTest01.java

package bgy_annotation_01;
/*
    @Overrid 源码如下:
        @Target(ElementType.METHOD)
        @Retention(RetentionPolicy.SOURCE)
        public @interface Override {
        }

    标示性注解,给编译器做参考
    编译器看到方法上有这个@Overrid注解时,编译器会自动检查该方法是否重写了父类的方法
    如果没用重写,会报错。

    这个注解只是在编译阶段起作用,和运行期无关。

    1. @Overrid 这个注解只能注解方法
    2. @Overrid 这个注解是给编译器参考的,和运行阶段没有关系
    3. 凡是java中的方法带有这个注解的,编译器都会进行编译检查,如果这个方法不是重写父类的方法,编译器报错。

 */

public class AnnotationTest01 {

    @Override
    public String toString(){
        return "toString方法";
    }
}

自定义注解

MyAnnotation0201.java
package bgy_annotation_01;

public @interface MyAnnotation0201 {

    /**
     * 通常在注解中可以定义属性,如下就是MyAnnotation01的name属性
     * 看者像方法,实际上被我们成为属性。
     * @return
     */
    String name();
}
MyAnnotation0202.java
package bgy_annotation_01;

public @interface MyAnnotation0202 {
    /**
     * 只有一个value属性时,可以使用的时候可以省略
     * @return
     */
    String value();
}
MyAnnotation0203.java
package bgy_annotation_01;

public @interface MyAnnotation0203 {
    // 名字属性
    String name();

    // 性别属性
    boolean sex();

    // 年龄属性
    int age();

    // 颜色属性
    // 可以指定默认值
    String color() default "red";
}
AnnotationTest02.java
package bgy_annotation_01;
/*
    1. 如果一个注解中有属性,那么必须给属性赋值
    2. 如果一个注解中只有一个属性value,在使用的时候,该属性名可以省略value
 */

public class AnnotationTest02 {

    // 报错原因:如果一个注解中有属性,那么必须给属性赋值
//    @MyAnnotation0201()
//    public void test(){
//
//    }

    // 语法格式:@MyAnnotation0201(属性名=属性值)
    public void doSome(){

    }

    // 如果一个注解中只用一个属性value,那么可以省略属性名value
    @MyAnnotation0202("value属性")
    public void doOther(){

    }

    // 可以使用默认值color
    @MyAnnotation0203(name="bgy",sex=true,age=15)
    public void doAnything01(){

    }
    // 可以修改默认值color
    @MyAnnotation0203(name="bgy",sex=true,age=15,color = "yellow")
    public void doAnything02(){

    }

    public static void main(String[] args) {

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值