* 第三十三集
* 了解注解及Java提供的几个注解的基本类型
* Suppress vt.镇压,压制;止住,忍住;禁止发表;阻止…的生长(或发展)
* 收尾:每个类都有一个特殊的方法finalizer,它不能被直接调用,而被JVM在
* 适当的时候调用,通常用来处理一些清理资源的工作,因此称为收尾机制。
* 先通过@SuppressWarnings的应用让大家直观的了解:
* --通过System.runFinalizerOnExit(true);的编译警告引出
* --@SuppressWarnings("deprecation")
* -@Deprecated
* ---直接在刚才的类中增加一个方法,并加上@Deprecated标注,在另外
* 一个类中调用这个方法。
* -@Override
* ---public boolean equals (Reflect other)方法与HashSet结合讲解
* 总结:
* --注解相当于一种标记,加了注解就等于加上了某种标记,没加则等于没有某种标记
*
* deprecated 过时的
*
* 当我要用这个注解前提是人家要写好这个注解,注解就相当于一个特殊的类
* 像写接口一样的写。。z
* --注解类定义@interface A{}
* --应用注解类的类@A ClassB{}
* --对“应用注解类的类”进行反射操作的类Class C {
* B.class.isAnnotionPresent(A.class)
* A a = B.class.getAnnotion(A.class)
* }
*
* 为注解增加高级属性
* 数组类型的属性
* --int[] arrayAttr(){1,2,3};
* --@MyAnnotation(arrayAttr={2,3,4})
* --如果这个数组属性中只有一个元素,这时候属性值部分可以省略大括号
* 枚举类型的属性
* --EnumTest.TrafficLamp lamp();
* --@MyAnnotation(lamp=EnumTest.Traffic.GREEN)
* 注解类型的属性:
* --MetaAnnotation annotationAttr()default@MetaAnntation("xxxx")
* --@MyAnnotation(annotationAtrr=@MetaAnnotation("yyy"))
* --可以认为上面这个@MyAnnotation是MyAnnotation类的一个实例对象,
* 同样的道理,可以认为上面的这个@MetaAnnotation是MetaAnnotation类的一个实例对象,
* 调用代码如下:
* MetaAnnotation ma = myAnnotation annotationAttr();
* System.out.println(ma.value);
* 注解的详细语法可以通过看java语言规范了解,
* 即看java的language specification 规格;详述;说明书
* java语言规范 langspec-3.0
* 注解的返回类型是八种基本类型 也可以是class类型 可以是枚举类型 可以是注解类型
* 也可以是这些类型的数组类型
*
*
*/
package cn.itcast.day2;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@ItcastAnnotation(annotationAttr=@MetaAnnotation("flx"), color = "red", value = "abc", arrayAttr = { 1,2,3 })
public class AnnotationTest {
/**
* 压缩警告
* main方法必须写在一个类里面但是不是必须属于类的成员
* 如果只有value时就不直接写成这种形式@ItcastAnnotation("abc")
* 因为还有color属性 所以要为color设置默认属性
*/
@SuppressWarnings("deprecation")
@ItcastAnnotation("abc")
public static void main(String[] args) {
// TODO Auto-generated method stub
System.runFinalizersOnExit(true);
if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class))
{
ItcastAnnotation annotation
= (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
/**
* 设计注解的时候里面加了说明将注解一直保留到运行
* @Retention(RetentionPolicy.RUNTIME)
* class里面的文件不是字节码
* 一个注解的生命周期有三个阶段
* --源文件是一个阶段--class文件是一个阶段--内存的字节码是一个阶段
*/
System.out.println(annotation.color());
System.out.println(annotation.value());
/**
* 这是一个数字无法打印,只能打印其属性
*/
System.out.println(annotation.arrayAttr().length);
System.out.println(annotation.lamp().nextLamp());
/**
* 注解的返回值还是一个注解
*/
System.out.println(annotation.annotationAttr().value());
}
}
/**
* 即使作废了也不能彻底的干掉,新人不要用,老人还可以用
* Deprecated
* 代码升级了,将老的代码作废
*/
@Deprecated
public static void sayHello(){
System.out.println("hi,传智播客");
}
}
package cn.itcast.day2;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import cn.itcast.day1.EnumTest;
/**
* 第三十四集 注解的定义与反射调用
* 自定义注解及其应用
* 定义一个简单的注解:public@interface MyAnnotation{}
* 把它加在某个类上:@MyAnnotation public class AnnotationTest{}
* 用反射进行测试AnnotationTest的定义上是否有@MyAnnotation
* 根据反射测试的问题,引出@Retention元注解的讲解,其三取值:
* RetetionPolicy.SOURCE、
* RetetionPolicy.CLASS、
* RetetionPolicy.RUNTIME;
* 分别对应:java源文件--class文件--内存字节码。
* --思考:@Override、@SuppressWarning和@Deprecated这三个注解
* 的属性值分别是什么?
* 演示和讲解@Target元注解
* --Target的默认值为任何元素,设置Target等于ElementType.METHOD,
* 原来加载类上的注解就报错了,改为用数组方式设置{ElementType.METHOD,ElementType}
* 就可以了
* 元注解以及其枚举属性值不用记,只要会看到jdk提供那几个基本注解的API
*
*/
/**
* 这是一个注解 标识是@interface
* 把这个注解用在类上
* 这是我定义注解,在定义注解的时候又加注解
* 这个元注解。是为我的注解服务的
* 信息的信息叫做元信息,注解的注解叫做元注解
* @Target(value = { ElementType.METHOD })
* 这个的意思是这个注解只能放在方法上
* ElementType.TYPE 既能在方法上,又能在类上
* 为甚是type而不是class Class的父类是Type
* 不仅可以加在Class上面,也可以在接口,枚举上面
* 这一类事物用Type来描述更加准确,在1.5里面才出现
* Enum ElementType
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(value = { ElementType.METHOD,ElementType.TYPE })
public @interface ItcastAnnotation {
/**
* 它和接口很像,知道它是抽象的公共的但是不用加
* 表示这个类有一个这样的方法
* @ItcastAnnotation(color = "red")
* 方法返回一个字符串
*/
String color() default "bule";
String value();
int[] arrayAttr() default {3,4,5};
EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;
MetaAnnotation annotationAttr() default @MetaAnnotation(value = "lhm");
}
/**
* 第三十五集 为注解增加基本的属性
* 什么事注解的属性
* --一个注解相当于一个胸牌,如果你胸前贴了胸牌,就是传智播客的学生,否则,就不是。
* 如果还想区分出来时传智播客哪个班的学生,这时候可以为胸牌在增加一个属性进行区分。
* 加了属性的标记效果为:@MyAnnotation(color="red")
* 定义基本类型的属性和反应属性:
* --在注解中增加String "color()";
* --@MyAnnotation(color="red")
* 用反射的方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法
* --MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class)
* --System.out.println(a.color());
* --可以认为上面这个@MyAnnotation是MyAnnotation类的一个实例对象
* 为属性指定缺省值
* --String color() default"yellow";
* value属性
* --String value() default "zxx";
* --如果注解中有一个名称为value的属性,且你只想设置value属性
* (即其他属性都采用默认值)
*
*/
package cn.itcast.day2;
/**
* 为增加高级类型的属性--注解类型的属性
* @author Administrator
*
*/
public @interface MetaAnnotation {
String value();
}