注解(Annotation)


注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等

于没有某种标记。

以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无

何种标记,看你有什么标记,就去干相应的事。

标记可以加在包,类,字段,方法,方法的参数以及局部变量上。

一个注解相当于一个类。

java.lang 包,可看到JDK 中提供的最基本的annotation

@SuppressWarning(”deprecation”)--->压制警告

SupressWarning 是告知编译器或开发工具等提示指定的编译器警告;

“deprecation”是告知具体的信息即方法已过时。

@Deprecated(过时的方法,对于不再使用的方法,可能别人或别的地方有调用这个方法,

不能删除完事)

直接在刚才的类中增加一个方法,并加上@Deprecated标注,在另外一个类中调用这个方法。

测试一下。

@SuppressWarnings("deprecation")(用这个可以告诉程序说,我知道调用的方法过时了)

@Override--->提示覆盖(父类方法)

public boolean equals(Reflectother)方法与HashSet 结合讲解

person 类,覆盖父类的equals hashCode 方法,人家接收的参数是Object,人们习

惯总是传入自己的对象,造成覆盖失败,变成重载!

注解的应用结构图
 

演示和讲解@Target元注解

Target(告诉编译器,自定义的注解类可以用在方法还是类....),设置Target 等于

ElementType.METHOD

{ElementType.METHOD,ElementType.TYPE}就可以了。

元注解以及其枚举属性值不用记,只要会看jdk 提供那几个基本注解的API 帮助文档的定义

或其源代码,按图索骥即可查到,或者直接看java.lang.annotation 包下面的类。

(自定义注解)示例代码:

@Retention(RetentionPolicy.RUNTIME)//告诉程序说,这个注解要保存到运行时期

@Target({ElementType.METHOD,ElementType.TYPE})//告诉编译器,这个注解可以用在方法

上,也可以用在类上

public @interface MyAnnotation {

String color() default"yellow";//默认缺省值为yellow

String value() ;//不指定

int [] arrayAttr() default{1,2};//默认为{1,2}

EnumTest.TrafficLamp lamp()default EnumTest.TrafficLamp.RED;//

枚举类

MetaAnnotation annotationAttr()default

@MetaAnnotation("xxx");//属性中加注解,用@。可以在对别的类加注解时,改变值

}

为注解增加基本属性

(可以是八种基本数据类型,String,数组,枚举,注解,Class

什么是注解的属性?

一个注解相当于一个胸牌,如果你胸前贴了胸牌,就是传智播客的学生,否则,就不是。

如果还想区分出是传智播客哪个班的学生,这时候可以为胸牌在增加一个属性来进行区分。

加了属性的标记效果为:@MyAnnotation(color="red")

定义基本类型的属性和应用属性:

在注解类中增加String color();

@MyAnnotation(color="red")

用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法

MyAnnotation a =(MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);

System.out.println(a.color());

可以认为上面这个@MyAnnotationMyAnnotaion 类的一个实例对象

如果注解中有一个名称为value 的属性,且你只想设置value 属性(即其他属性都采用默认

值或者你只有一个value 属性),那么可以省略value=部分,例如:@MyAnnotation("lhm")

枚举和注解都是特殊的类,不能用new 创建它们的实例对象,创建枚举的实例对象就是在

其中增加元素。

在程序中如何创建出一个注解的实例对象啊?直接用@放上一个标记即可

Egpackage july78javaEnhance;

importjava.lang.annotation.Retention;

importjava.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)//

RUNTIME,保留到运行期间

/**

* 指示注释类型的注释要保留多久。如果注释类型声明中不存在Retention 注释,

* 则保留策略默认为 RetentionPolicy.CLASS

*/

//@Target(ElementType.METHOD)如果加上这句的话(只能作用于方法),那边就会报

错!

public @interfaceAnnotationDemo12 {//注解

String color() default"blue";//相当于构造方法一样,如果给了它默认的初

值,可以不用再设置(有默认的)

String value();

int []age();//数组和枚举类型的注解

//还有注解类型的注解,暂时没学会

MetaAnnotation annotation();

//上面的MetaAnnotation是自己定义的一个注解类型,这样的话对于应用了当前注

解的AnnotationDemo11类,就必须写上注解类型的属性

}

package july78javaEnhance;

import java.util.Arrays;

//备注:应用注解后,它的属性你你没有写上,它会给予提醒!missingattribution

@AnnotationDemo12(color ="red",value = "j2ee",age = {1,2,3},

annotation = @MetaAnnotation(sex= ""))//注解加注解

public class AnnotationDemo11 {

@SuppressWarnings("deprecation")//压缩注解,一个注解就是一个类,用到

的一个注解就相当于是调用的实例对象

@AnnotationDemo12(value ="jase",age = {1,2,3}, annotation =

@MetaAnnotation(sex = ""))//备注:如果别的属性有默认值,只有一个属性需要

你设置,那么你就不需要写上全部的

//赋值表达式,如上直接写上"jase"就行

public static void main(String[]args) {

System.runFinalizersOnExit(true);//表示已经过时的方法,开发工具会

给它中间加上一天横线

/**

* booleanisAnnotationPresent(Class<? extends Annotation>

annotationClass)

如果指定类型的注释存在于此元素上,则返回true,否则返回false

*/

if(AnnotationDemo11.class.isAnnotationPresent(AnnotationDemo12.

class)){

AnnotationDemo12 annocation =

(AnnotationDemo12)AnnotationDemo11.class

.getAnnotation(AnnotationDemo12.class);//

面有你的注解

System.out.println(annocation.color());//调用属性

System.out.println(Arrays.toString(annocation.age()));//

打印出来

System.out.println(annocation.annotation().sex());//相当

于调用属性的属性

}

}

}
  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值