------- android培训、java培训、期待与您交流! ----------
一:基础内容
1.必须掌握的英语单词:
Annotation [ænə'teɪʃ(ə)n] n. 注释;注解;释文。
Deprecated [ˈdeprəkeɪtɪd]v. 不赞成;弃用;不宜用
Override [əʊvə'raɪd] 覆盖;重写;重载
suppress[sə'pres]vt. 抑制;镇压;废止
warning['wɔːnɪŋ]n. 警告;预兆;预告
Present ['prez(ə)nt] vt. 提出;介绍;呈现 adj. 现在的;出席的
Retention [rɪ'tenʃ(ə)n] n. 保留;扣留,滞留;
policy['pɒləsɪ]n. 政策,方针;保险单
ElementType单元类型
2.必须理解的类与接口:
java.lang Deprecated注释类型:用 @Deprecated 注释的的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告。
java.lang Override注释类型:@Override表示一个方法声明打算重写超类中的另一个方法声明。如果方法利用此注释类型进行注解但没有重写超类方法,则编译器会生成一条错误消息。
java.lang SuppressWarnings注释类型:@SuppressWarning指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。注意,在给定元素中取消显示的警告集是所有包含元素中取消显示的警告的超集。
java.lang.annotationElementType枚举:程序元素类型。此枚举类型的常量提供了 Java 程序中声明的元素的简单分类。
这些常量与 Target 元注释类型一起使用,以指定在什么情况下使用注释类型是合法的
二:什么是注解:
1.注解相当于一个标记,加注解就等于为程序打上了某种标记.
以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素
上有无何种标记,看你有什么标记,就去干相应的事。标记可以加载包,类,字段
方法,方法的参数以及局部变量上。
2.一个注解就是一个类。使用注解就相当于创建了该类的实例对象。
3.java提供了三个注解都在Java lang 中。
4.注解用途:
@Oeprecated标示该方法过时了。
@Override检查是否覆盖父类的方法。
@SuppressWarning取消显示指定的编译器警告
5.注解的作用:
向编译器javac或工具软件传达一种信息。
6注解的应用:
步骤一:创建一个注解
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface A {
String name();
}
步骤二:把注解标记到类上面
package zhujie2;
@A(name = "peng")
public class B {
}
步骤三:通过反射获取注解
public class C {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
B.class.isAnnotationPresent(A.class);
A a = B.class.getAnnotation(A.class);
System.out.println(a);
}
}
三:元注解:
1.元注解:注解中的注解称为元注解。
2.元注解:@RetetionPolicy
是一个枚举其有三个取值:SOURCE,CLASS,RUNTIME。他们分别代表了注解的生命周期:
1)一般javac把源文件编译成Class文件的时候会把源程序里面的一些注解给去掉。
2)注解想要保留下来则要用元注解@Retetion在注解上面标明:
3)一个注解的生命周期有三个阶段:
第一个阶段源文件--->RetetionPolicy.SOURCE
第二个阶段class文件--->RetentionPolity.CLASS
第三阶段内存中的字节码--->RetetionPolity.RUNTIME
例:
@Retention(RetentionPolicy.RUNTIME)
public @interface ItcastAnnotation {
}
@override在生命周期的SOURCE阶段
@SuppressWarning在生命周期的CLASS阶段,给编译器看的。
@Oeprecated在生命周期的给CLASS阶段,给编译器看的。
3.元注解:@Target
作用是用于说明我们的注解能用在那个成分上面。
指定注解在方法上。
@Target(ElementType.METHOD)
指定注解在类上面
@Target({ElementType.METHOD,ElementType.TYPE})
为什么这里用ElementType.TYPE而不是用ElementType.CLASS呢?
原因:在于CLASS有个父类接口是TYPE,所以用起来TYPE更加精准。
举例:
package zhujie;
@ItcastAnnotation(color = "red",value ="abc")
//在创建注解的时候把属性值给设进去。
public class AnnotationTest {
/**
* @param args
*/
/*这也是属性,这个是只有一个属性的时候可以省略=前面的属性名。
其与@SuppressWarnings( 属性名 = "deprecation")是等效的。*/
@SuppressWarnings("deprecation")
//还有中方法是为属性指定缺省值:即在String color() default "yellow";这样就剩value没有指定了。
@ItcastAnnotation("xyz")
public static void main(String[] args) {
// TODO Auto-generated method stub
//AnnotationTest是否有ItcastAnnotation这个注解
if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){
//获取注解
ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
System.out.println(annotation);
//打印注解属性。
System.out.println(annotation.color());
}
}
}
四:为注解添加属性
1.为注解添加属性这是注解强大的原因。
2.什么是注解的属性:
一个注解相当于一个标识,如果想在同类标识中再区分的更加详细则就为它添加属性,而这些属性
就是为了区分在同类中的不同。例如:一个注解相当与一个胸牌,如果你贴了胸牌就代表你是创智播客的学生
否则 ,就不是,如果还想区分出创智播客的那个班的学生,这个时候可以为胸牌添加一个属性来区分。
为了属性的标记效果为:@MyAnnotation(color = “red”)
3.定义基本类型属性和应用属性:
在注解中增加String color();
@MyAnnotation(color = “red”)
4.用反射方式获得注解对应的实例对象后,在通过该对象调用属性对应的方法
MyAnnotation a = (MyAnnotation)AnnotationTest3.class.getAnnotation(MyAnnotation.class);
System.out.println(a.color());
可以认为上面这个@MyAnnotation是MyAnnotation类的一个实例对象。
5.为属性指定缺省值:
String color() defauit “yellow”;
Value的属性:
String Value() default ”zxx”
这里的缺省defauit 相当于“设置默认值的意思”;即相当于给Value设置一个默认值。
五:为注解属性添加高级属性。
1.数组类型的属性
Int [] arrayAttr() default{1,2,3};
@MyAnnotation(arrayAttr = {2,3,4})
如果数组属性中只有一个元素,这时候属性值部分可以省略大括号。
2.枚举类型的属性
EnumTest.TrafficLamp lamp();
@MyAnnotation(lamp = EnumTest.TrafficLamp.GREEN)
3.注解类型的属性:
MetaAnnotation annotationAttr() default @MetaAnnotation(“xxxx”);
@MyAnnotation(annotationAttr = @MetaAnnotation(“yyy”))
可以认为上面这个@MyAnnotation是MyAnnotation类的一个实例对象,同样道理,
可以认为上面这个@MetaAnnotation是MetaAnnotation类的一个实例对象,代用
代码如下:
MetaAnnotation ma = MyAnnotation.annotationAttr();
System.out.println(ma.value());
举例:
1)注解部分第一部分
package zhujie;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import meiju.AbstractEnum;
//注解中的注解称之为元注解。
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface ItcastAnnotation2 {
String color() default "yello";//缺省类型的属性
String value();//一般类型的属性
int[] arrayAttr() default {3,4,5}; //数组类型的属性
AbstractEnum.TrafficLamp lamp() default AbstractEnum.TrafficLamp.RED;
MetaAnnotation annotationAttr() default @MetaAnnotation("lhm");//注解类型的属性
Class a() default Integer.class;
}
2)注解第二部分
package zhujie;
public @interface MetaAnnotation {
String value();
}
<span style="color: rgb(67, 67, 67); font-family: 宋体; font-size: 14.5pt; letter-spacing: 0pt; line-height: 18pt; text-indent: 21pt; background-color: rgb(242, 242, 242);">3</span><span style="color: rgb(67, 67, 67); font-family: 宋体; font-size: 14.5pt; letter-spacing: 0pt; line-height: 18pt;">)被标记注解的类</span>
package zhujie;
@ItcastAnnotation2( a = String.class,annotationAttr = @MetaAnnotation("flx"),color = "red",value ="abc",arrayAttr = {1,2,3}/*arrayAttr = 1也可以*/)
public class AnnotationTest2 {
/**
* @param args
*/
@ItcastAnnotation2("blue")
public static void main(String[] args) {
// TODO Auto-generated method stub
//AnnotationTest是否有ItcastAnnotation这个注解
if(AnnotationTest2.class.isAnnotationPresent(ItcastAnnotation2.class)){
//获取注解
ItcastAnnotation2 annotation2 = (ItcastAnnotation2)AnnotationTest2.class.getAnnotation(ItcastAnnotation2.class);
//打印注解属性。
System.out.println(annotation2);
System.out.println(annotation2.color());
System.out.println(annotation2.value());
System.out.println(annotation2.arrayAttr().length);//大一不出来,原因Integer[]数组
System.out.println(annotation2.lamp().nextLamp().name());//枚举类型
System.out.println(annotation2.annotationAttr().value());//注解的返回值还是个注解
}
}
}