------------- java培训、android培训、java博客、java学习型技术博客、期待与您交流! --------------
几个基本的注解
l@SuppressWarnings
Ø通过System.runFinalizersOnExit(true);的编译警告引出@SuppressWarnings("deprecation")
l@Deprecated
Ø直接在刚才的类中增加一个方法,并加上@Deprecated标注,在另外一个类中调用这个方法。
l@Override
Øpublicboolean equals(Reflect other)方法与HashSet结合讲解
l总结:
Ø注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
Ø看java.lang包,可看到JDK中提供的最基本的annotation。
示例:
packagecn.itcast.day2;
//注解
public class AnnotationTest {
@SuppressWarnings("deprecation")//抑制过时声明,但是eclipse不会取消双横线,但运行的时候,不会声明
public static void main(String[] args){
System.runFinalizersOnExit(true);
}
@Deprecated//声明此方法已经过时
public String sayHallo(){
return "你好";
}
@Override//声明是覆盖该父类的方法,如果没正确覆盖,程序会报错
public String toString() {
return null;
}
}
1、自定义注解及其应用
2、定义一个最简单的注解:public @interfaceMyAnnotation {}
3、把它加在某个类上:@MyAnnotation public classAnnotationTest{}
4、用反射进行测试AnnotationTest的定义上是否有@MyAnnotation
5、根据发射测试的问题,引出@Retention元注解的讲解,其三种取值:RetetionPolicy.SOURCE、RetetionPolicy.CLASS、RetetionPolicy.RUNTIME;分别对应:java源文件-->class文件-->内存中的字节码。
思考:@Override、@SuppressWarnings和@Deprecated这三个注解的属性值分别是什么?@Retention(value=SOURCE), @Retention(value=SOURCE), @Retention(value=RUNTIME)
6、@Target元注解
lTarget的默认值为任何元素,设置Target等于ElementType.METHOD,原来加在类上的注解就报错了,改为用数组方式设置{ElementType.METHOD,ElementType.TYPE}就可以了。
7、元注解以及其枚举属性值不用记,只要会看jdk提供那几个基本注解的API帮助文档的定义或其源代码,按图索骥即可查到,或者直接看java.lang.annotation包下面的类。
2、为注解增加基本属性
l什么是注解的属性
Ø一个注解相当于一个胸牌,如果你胸前贴了胸牌,就是传智播客的学生,否则,就不是。如果还想区分出是传智播客哪个班的学生,这时候可以为胸牌在增加一个属性来进行区分。加了属性的标记效果为:@MyAnnotation(color="red")
l定义基本类型的属性和应用属性:
Ø在注解类中增加String color();
Ø@MyAnnotation(color="red")
l用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法
ØMyAnnotationa = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
ØSystem.out.println(a.color());
Ø可以认为上面这个@MyAnnotation是MyAnnotaion类的一个实例对象
l为属性指定缺省值:
ØStringcolor() default "yellow";
lvalue属性:
ØStringvalue() default "zxx";
Ø如果注解中有一个名称为value的属性,且你只想设置value属性(即其他属性都采用默认值或者你只有一个value属性),那么可以省略value=部分,例如:@MyAnnotation("lhm")。
示例
1、package cn.itcast.day2;
public @interface MetaAnnotation {
String value();
}
2、package cn.itcast.day2;
importjava.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import cn.itcast.day1.EnumTest;
@Retention(RetentionPolicy.RUNTIME)//指示注释类型的注释要保留多久。
// 枚举RetentionPolicy:RetetionPolicy.SOURCE、RetetionPolicy.CLASS、RetetionPolicy.RUNTIME;分别对应:java源文件-->class文件-->内存中的字节码。
@Target({ElementType.METHOD,ElementType.TYPE})
//指示注释类型所适用的程序元素的种类。ANNOTATION_TYPE注释类型声明,CONSTRUCTOR构造方法声明,FIELD 字段声明(包括枚举常量),LOCAL_VARIABLE局部变量声明,METHOD方法声明
//PACKAGE包声明, PARAMETER 参数声明,TYPE类、接口(包括注释类型)或枚举声明
public @interface ItcastAnnotation {
String color() default "blue";//问注解添加属性,可设置默认值
String value();
int[] arrayAttr() default {2,3,4};
EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;
MetaAnnotation annotationAttr() default @MetaAnnotation("lhm");//annotationAttr注解属性值
}
3、packagecn.itcast.day2;
//注解
@ItcastAnnotation(annotationAttr=@MetaAnnotation("flx"), color="red",value="abc",arrayAttr={1,2,3})//等于一个对象
public class AnnotationTest {
@SuppressWarnings("deprecation")//抑制过时声明,但是eclipse不会取消双横线,但运行的时候,不会声明
@ItcastAnnotation("xyz")
public static void main(String[] args)
throws Exception{
System.runFinalizersOnExit(true);
if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){
ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);//判断类中是是否含有注解
System.out.println(annotation.color()+":::"+annotation.value());
System.out.println(annotation.arrayAttr().length);
System.out.println(annotation.lamp().nextLamp().name());
System.out.println(annotation.annotationAttr().value());
}
}
}
------------- java培训、android培训、java博客、java学习型技术博客、期待与您交流! -------------
详情请查看:http://edu.csdn.net/heima/
分享到:
相关推荐
黑马程序员 - 毕向东 - Java基础教学 - 第02天 个人观看视频总结文档
黑马程序员 - 毕向东 - Java基础教学 - 第01天 个人观看视频总结文档
day01_Object类、常用API day02_Collection、泛型 day03_List、Set、数据结构、Collections day04_Map,斗地主案例 day05_异常,线程 day06_线程、同步 day07_等待与唤醒案例、线程池、Lambda...Java基础小节练习题答案
黑马程序员-SpringCloud-学习笔记-03-Eureka注册中心
黑马程序员--毕向东全套Java视屏,讲解的相当全面,各位如果需要,尽快下载哦! 另外如果视频链接存在打不开的问题,请留言,必定及时更新链接。
黑马程序员-SpringCloud-学习笔记01-认识微服务
黑马QT讲义,适合QT入门,使用,教程很比较基础,新手可以看看,另外视频链接在哔哩哔哩中。
黑马程序员 - Java基础教学 - 05 - 面向对象(1).doc
黑马程序员-java32期培训视频(基础+就业)黑马程序员-java32期培训视频(基础+就业)
黑马程序员 - Java基础教学 - 04 - 数组、进制转换、二维数组
黑马程序员-SpringCloud-学习笔记-02-微服务拆分及远程调用
NULL 博文链接:https://840198532-qq-com.iteye.com/blog/1490899
黑马程序员 - Java基础教学 - 03 - 变量的作用域、for循环、break、continue、内存结构
黑马程序员 - Java基础教学 - 08 - 面向对象(4)-多态.doc
黑马程序员 - Java基础教学 - 06 - 面向对象(2) - 关于静态static的那些事.doc
黑马程序员-梅兰商城项目实战,包含图片素材和编写源码。
C++黑马程序员-演讲比赛流程管理系统记录
NULL 博文链接:https://840198532-qq-com.iteye.com/blog/1490901
NULL 博文链接:https://huangminwen.iteye.com/blog/1157983
NULL 博文链接:https://840198532-qq-com.iteye.com/blog/1490903