16章、Java——注解是什么

16章、Java——注解是什么,第1张

16章、Java——注解是什么

课程大纲
1、认识Annotation
2、系统定义的Annotation
3、自定义Annotation
4、Retention和RetentionPolicy
5、反射与Annotation
6、@documented注解
7、@Target注解
8、@Inherited注解

1、认识Annotation

JDK1.5开始,Java增加了对元数据(即类的组成单元数据)的支持,也就是(Annotation)
注解,他是代码里做的特殊标记,这些标记可以在编译,类加载,运行时在不改变原有
逻辑的情况下,被读取,并执行相应的处理,通过使用Annotation,程序员可以在源文
件中嵌入一些补充的信息。代码分析工具,开发工具和部署工具可以通过这些补充信息
进行验证或者进行部署。Annotation类似于修饰符一样被使用,可以用于包,类,构造
方法,方法,成员变量,参数,局部变量的声明。
注意:
Annotation是一个接口
java.lang.Annotation接口
注解的本质是标记,他所有的功能都依赖于对这个注解解释性的代码,通常需要结合反射来编写解释性代码.

2、系统定义的Annotation

在JDK 1.5之后,在系统中提供了三个Annotation,分别是:@Override、@Deprecated、@SuppressWarnings。
@Override
表示当前的方法定义将覆盖超类中的方法。如果你不小心拼写错误,或者方法签名对不上被覆盖的方法,编译器就会发出错误提
示。
@Deprecated
表示的是一个类或方法已经不再建议继续使用了,标记为已过时。
@SuppressWarnings
表示关闭不当的编译器警告信息。
@SuppressWarnings(“unchecked”)//未检查的转化,如集合没有指定类型
@SuppressWarnings(“unused”) //未使用的变量
@SuppressWarnings(“resource”) //有泛型未指定类型
@SuppressWarnings(“path”) //在类路径,原文件路径中有不存在的路径
@SuppressWarnings(“deprecation”) //使用了某些不赞成使用的类和方法
@SuppressWarnings(“fallthrough”) //switch语句执行到底没有break关键字
@SuppressWarnings(“serial”)//某类实现Serializable 但是没有定义serialVersionUID 这个需要但是不必须的字段
@SuppressWarnings(“rawtypes”) //没有传递带有泛型的参数
@SuppressWarnings(“all”) //全部类型的警告

 //Override用于验证方法是否覆盖父类中的方法
    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }

    //用于标记方法以过时不建议使用
    @Deprecated
    public String printInfo(){
        return "Cat{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }
@SuppressWarnings("all")
public class AnnotationDemo {
    @Test
    public void test1(){
        Cat cat=new Cat();
        cat.printInfo();//调用了一个已过时的方法


        List list= new List();
        list.add("vince");
        list.add(String.valueOf(10.1f));

    }
}
3、自定义Annotation

注解应用需要三个步骤:
(1)编写注解
(2)在类上应用注解
(3)对应用了注解的类进行反射 *** 作的类
自定义Annotation的语法如下:
访问控制权限 @interface Annotation名称{}
例如:
public @interface MyAnnotation {}

在Annotation中定义变量
	public @interface MyAnnotation {
		public String name();
		public String info();
	}
定义变量后,在调用此Annotation时必须设置变量值。
	@MyAnnotation(name = “vince", info = “hello")
	public class Demo {
		}
通过default指定变量默认值,
有了默认值在使用时可以不设值
	public @interface MyAnnotation {
		public String name() default “vince";
		public String info() default “hello";
	}
	
定义一个变量的数组,接收一组参数
	public @interface MyAnnotation {
		public String[] name();
	}
使用时指定数组值
	@MyAnnotation(name = { “jack", “vince" })
	public class Demo {
	}
使用枚举限制变量取值范围
	public enum Color {
	RED, GREEN, BLUE
}
	public @interface MyAnnotation {
	public Color color();
}
4、Retention和RetentionPolicy

Annotation要想决定其作用的范围,通过@Retention指定,而Retention指定的范围由
RetentiontPolicy决定,RetentionPolicy指定了三种范围:

范围描述public static final RetentionPolicy SOURCE在java源程序中存在public static final RetentionPolicy CLASS在java生成的class中存在public static final RetentionPolicy RUNTIME在java运行的时候存在

示例:

//表示改注解的作用范围在运行时存在
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
	public String name();
}
5、反射与Annotation

一个Annotation真正起作用,必须结合反射机制,在反射中提供了以下的 *** 作方法:
java.lang.reflect.AccessibleObject:

public boolean isAnnotationPresent(ClassannotationClass) 判断是否是指定的Annotation

public Annotation[] getAnnotations() 得到全部的Annotation

示例:
Class cls = Class.forName(“com.vince.annotation.Test");
Method met = cls.getMethod(“setName"); // 找到setName()方法
if (met.isAnnotationPresent(MyAnnotation.class)) {
	MyAnnotation my = (MyAnnotation) met
					.getAnnotation(MyAnnotation.class);
	String name = my.name();
	String info = my.info();
	System.out.println("name =
	" + name);
	System.out.println("info =
	" + info);
	}
6、@documented注解

此注解表示的是文档化,可以在生成doc文档的时候添加注解。

@documented
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
	public String name();
	public String info();
	}
可以增加一些DOC注释。

@MyAnnotation(name =“vince", info =“teacher")
public String toString() {
	return "hello";
}
7、@Target注解

@Target注解表示的是一个Annotation的使用范围,例如:之前定义的MyAnnotation可以在任意
的位置上使用。
范围 描述
public static final ElementType TYPE 只能在类或接口或枚举上使用
public static final ElementType FIELD 在成员变量使用
public static final ElementType METHOD 在方法中使用
public static final ElementType PARAMETER 在参数上使用
public static final ElementType
ConSTRUCTOR 在构造中使用
public static final ElementType
LOCAL_VARIABLE 局部变量上使用
public static final ElementType
ANNOTATION_TYPE 只能在Annotation中使用
public static final ElementType PACKAGE 只能在包中使用

范围描述public static final ElementType TYPE只能在类或接口或枚举上使用public static final ElementType FIELD在成员变量使用public static final ElementType METHOD在方法中使用public static final ElementType PARAMETER在参数上使用public static final ElementType CONSTRUCTOR在构造中使用public static final ElementTypeLOCAL_VARIABLE局部变量上使用public static final ElementTypeANNOTATION_TYPE只能在Annotation中使用public static final ElementType PACKAGE只能在包中使用 8、@Inherited注解
@Inherited表示一个Annotation是否允许被其子类继承下来。
示例
@Inherited
@Target(value = ElementType.TYPE)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
	public String name();
	public String info();
}
使用时允许被其子类所继承。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5684189.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存