自定义注解

内置注解

@Override

  • 用来标注方法是否是重写的父类的方法,如果不是重写的父类方法将会报异常
    创建一个Father类
public class Father {
	public void sleep() {
		System.out.println("FatherSleep");
	}
}
  • 创建一个Son类,并重写Father类中的sleep方法
public class Son extends Father {
	@Override
	public void sleep() {
		System.out.println("SonSleep");
	}
}

在这里Son类的sleep方法上加了@Override方法用来标识,Son类的方法重写了父类的sleep方法
如果给Son类添加一个新的,父类并没有的方法,再在上面加上@Override注解就会报错

public class Son extends Father {
	@Override
	public void sleep() {
		System.out.println("SonSleep");
	}
	
	@Override
	public void work() {
		System.out.println("SonWorks");
	}
}
  • work方法就会报错

异常信息:The method work() of type Son must override or implement a supertype method

@Deprecated

  • 说明所标注的成员变量或者方法已经过时(不推荐使用),如果使用编译器将会报警告信息
    给Father类的sleep方法上加@Deprecated注解
public class Father {
	@Deprecated
	public void sleep() {
		System.out.println("FatherSleep");
	}
}

加上@Deprecated之后
在这里插入图片描述
测试类

public class AnnotationTest {
	@Test
	public void test1() {
		Father father = new Father();
		father.sleep();
	} 
}

在这里插入图片描述
在这里插入图片描述
虽然不影响执行程序结果,但是加上@Deprecated以说明该方法已经不推荐使用,在使用的时候eclipse会在该方法上显示中划线,并报出警告信息。

@SuppressWarnings

  • 忽略警告信息,加上@SuppressWarnings注解之后如果出现警告信息将会忽略,不再显示警告细腻。
  • 测试父类的sleep方法@Deprecated注解的作用的想要忽略警告信息,就可以加上@SuppressWarnings注解
    在这里插入图片描述
  • 加上@SuppressWarnings注解之后
    在这里插入图片描述
    @SuppressWarnings也可以加在类上或者成员变量上
    在这里插入图片描述

自定义注解

  • 自定义注解结构
[public] @interface 注解名 {
   [属性1;]
   [属性2;]
   ...
   [属性n;]
}

属性结构

数据类型 属性名() [default 默认属性值];

注意:

  1. 注解属性默认没有默认值,如果注解中定义了无默认值的注解属性,则使用该注解时必须给属性指定值,否则会报错。
  2. 如果注解的属性名为vale可以直接赋值。
  3. 如果注解的属性是一个数组,但是该数组只有一个元素,则可以把{}省略,如果超过一个则需要加上{}

定义一个注解@MyAnnotation

public @interface MyAnnotation {
	String value() default "";
}

元注解

  • Java提供了四个用于修饰自定义注解的元注解:@Target、@Retention 、@Documented和@Inherited

@Target

  • @Target:用于限定被修饰的自定义注解修饰的元素类型,该元注解属性有
  1. ElementType.ANNOTATION_TYPE:应用于其他注解的元注解
  2. ElementType.CONSTRUCTOR:应用于构造函数
  3. ElementType.FIELD:应用于全局属性
  4. ElementType.LOCAL_VARIABLE:应用于方法中的本地变量
  5. ElementType.METHOD:应用于方法
  6. ElementType.PACKAGE:应用于包
  7. ElementType.PARAMETER:应用于方法的参数
  8. ElementType.TYPE:应用于类、接口或者枚举声明

常用的属性有ElementType.FIELD、ElementType.METHOD、ElementType.PARAMETER、ElementType.TYPE

ElementType.FIELD

  • 应用于成员变量的属性
@Target(ElementType.FIELD)
public @interface MyAnnotation {
	String value() default "";
}

这时候自定义注解只能用在成员变量上,用在其他的地方将会报错

public class Father {
	@MyAnnotation
	int age;
	public void sleep() {
		System.out.println("FatherSleep");
	}
}

ElementType.METHOD

  • 应用于普通方法的属性
@Target(ElementType.METHOD)
public @interface MyAnnotation {
	String value() default "";
}

在这里插入图片描述

  • 把自定义注解放在方法上面之后不会出现错误了
    在这里插入图片描述

ElementType.TYPE

  • 应用于类、接口或者枚举声明
@Target(ElementType.TYPE)
public @interface MyAnnotation {
	String value() default "";
}

这时如果注解加在方法上面就会报错
在这里插入图片描述
把这个注解加载类上面,就不会报错了
在这里插入图片描述

ElementType.PARAMETER

  • 应用于方法的参数
@Target(ElementType.PARAMETER)
public @interface MyAnnotation {
	String value() default "";
}

着中国自定义注解的使用

public class Father {
	int age;
	public void sleep() {
		System.out.println("FatherSleep");
	}
	public void sleep(@MyAnnotation String name) {
		System.out.println("FatherSleep");
	}
}

@Retention

  • @Retention:指定被修饰的自定义注解可以保留多久,该元注解有属性值如下
  1. RetentionPolicy.SOURCE:编译器将直接丢弃被修饰的注解。
  2. RetentionPolicy.CLASS:默认值,编译器将把注解记录在class文件中,当运行Java程序时,虚拟机不再保留注解;
  3. RetentionPolicy.RUNTIME:编译器将把注解记录在class文件中,当运行java程序时,虚拟机保留注解,程序可以通过反射获取该注解;

常用的属性为

RetentionPolicy.RUNTIME

public @interface MyAnnotation {
	String value() default "";
}

运行测试类

@Test
	public void test2() {
		Class clazz = Father.class;
		Annotation[] annotations = clazz.getAnnotations();
		for (Annotation annotation : annotations) {
			System.out.println(annotation);
		}
	}

运行结果没有输出该类的注解

  • 添加@Retention(RetentionPolicy.RUNTIME)元注解
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
	String value() default "";
}

在这里插入图片描述

@Inherited

  • @Inherited:如果父类所使用的注解有@Inherited修饰,则子类可以继承该注解,否则不能继承。

直接运行测试中的测试方法

@Test
	public void test2() {
		Class clazz = Son.class;
		Annotation[] annotations = clazz.getAnnotations();
		for (Annotation annotation : annotations) {
			System.out.println(annotation);
		}
	}

没有输出
给自定义注解加上@Inherited元注解

@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface MyAnnotation {
	String value() default "";
}

再次运行测试方法,控制台上可以输出该类的子类的注解
在这里插入图片描述

@Documented

  • @Documented:执行javadoc命令时,被该元注解修饰的自定义注解也会生成在文档中不加该注解将不会在生成的文档中出现自定义的注解
    在这里插入图片描述
  • 加上该注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface MyAnnotation {
	String value() default "";
}

生成的文档就会有该类的注解
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值