注解 Annotation
---------------------------------------------------------------------------------------------------------------------------------------------
注解
1、一个注解,就是一个类,相当于是一个标记,什么样的标记,干什么样的事儿。
2、常见的注解
2、常见的注解
@SuppressWarnings 取消显示指定的编译器警告。@Deprecated 过时,或者通常是因为它很危险或存在更好的选择。@Override 一个方法声明打算重写超类中的另一个方法声明。
3、@Retention 一个注解的声明周期有3个阶段
1、Java源文件--->RetentionPolig.SOURCR 注解只保留在源文件中2、class文件--->RetentionPolig.CLASS 注解只保留在class文件中3、内存中的字节码--->RetentionPolig.RUNTIME 注解只保留在内存中
4、 @target 表示自定义注解应用的范围
@Target(ElementType.METHOD) --- 方法上@Target(ElementType.TYPE) --- 类上
5、注解可标 声明在包、类、字段、方法、局部变量、方法参数等的前面
用来对这些元素进行说明,注释。它的作用非常的多例如:进行编译检查、生成说明文档、代码分析等。
6、要实现一个自定义注解,必须通过 @interface 关键字来定义。且在 @interface 之前,
需要通过元注解来描述该注解的使用范围( @Target )、生命周期( @Retention )
6、注解可以看成是一个接口,注解实例就是一个实现了该接口的动态代理类。
7、注解大多是用做对某个类、方法、字段进行说明,标识的。
7、注解大多是用做对某个类、方法、字段进行说明,标识的。
以便在程序运行期间我们通过反射获得该字段或方法的注解的实例,来决定该做些什么处理或不该进行什么处理
8、注解的使用分为三个过程: 定义注解-->声明注解-->得到注解
(下详细)
9、注解很重要。
-------------------------------------------------------
-------------------------------------------------------
一个注解,就是一个类 注解相当于是一个胸牌
【注解非常重要,能感觉到其作用不仅仅源于注释,和我所学到的下面的知识,
【注解非常重要,能感觉到其作用不仅仅源于注释,和我所学到的下面的知识,
当注解结合反射技术肯定能让我做太多的事情】
@SuppressWarnings 取消显示指定的编译器警告。
@Deprecated 过时,或者通常是因为它很危险或存在更好的选择。
@Override 一个方法声明打算重写超类中的另一个方法声明。
注解 相当于一个标记,加了注解就等于搭上了某种标记
没加,则等于没有某种标记,以及欧,java 编译器开发工具和其他程序可以用发射来了解你的类及各种元素上有无任何标记,看你的 有什么标记,就去干相应的事,
标记可以声明在包、类、字段、方法、局部变量、方法参数等的前面
用来对这些元素进行说明,注释。它的作用非常的多例如:进行编译检查、生成说明文档、代码分析等。
注解可以有哪些成员
注解和接口相似,它只能定义final 静态属性和公共抽象方法。
注解的方法
1.方法前默认会加上public abstract2.在声明方法时可以定义方法的默认返回值。列如
String color() default "blue"; >>
public abstract String color() default "blue";
String[] color() default {"blue", "red",......} >>
public abstract String[] color() default {"blue", "red",......}
注解的使用分为三个过程。
定义注解-->声明注解-->得到注解
a. 定义注解(参照上面的注解定义)
b. 声明注解
定义注解-->声明注解-->得到注解
a. 定义注解(参照上面的注解定义)
b. 声明注解
1. 在哪些元素上声明注解
如果定义注解时没有指定@Target 元注解来限制它的使用范围,那么该注解可以使用在ElementType 枚举指定的任何一个元素前。否则,只能声明在@Target 元注解指定的元素前。一般形式:@注解名()
2. 对注解的方法的返回值进行赋值
对于注解中定义的每一个没有默认返回值的方法,在声明注解时必须对它的每一个方法的返回值进行赋值。一般形式:@注解名(方法名=方法返回值,......)如果方法返回的是一个数组时,那么将方法返回值写在{}符号里@注解名(方法名={返回值1,返回值2,......},......)
3. 对于只含有value 方法的注解,在声明注解时可以只写返回值。
c. 得到注解
对于生命周期为运行期间的注解,都可以通过反射获得该元素上的注解实例。
1、声明在一个类中的注解
可以通过 该类Class 对象的 getAnnotation 或getAnnotations 方法获得。
2、声明在一个字段中的注解
通过 Field 对象的getAnnotation 或getAnnotations 方法获得
3、声明在一个方法中的注解
通过 Method 对象的getAnnotation 或getAnnotations 方法获得
// 注解类
@interface A{}
// 应用了注解类 -- 的类
@A
class B{}
//对 --应用了注解类 --的类
class C{
B.class.isAnnotationPresent{
A.class;
}
A a = B.class.getAnnotation(A.class);
}
【】1、 生命周期
一个注解的声明周期有3个阶段对应@Retention 元注解
1、Java源文件 -------------->RetentionPolig.SOURCR 注解只保留在源文件中
2、class文件 -------------->RetentionPolig.CLASS 注解只保留在class文件中
3、内存中的字节码 -------------->RetentionPolig.RUNTIME 注解只保留在内存中
思考: 这三个注解在什么阶段
@SuppressWarnings@Deprecated@Override
【】2、 类型 Type
1、class 2、interface 3、enum 4、@Interface
1、class 2、interface 3、enum 4、@Interface
他们有点像类,但又不是类, 他们是java 中的一个类型
【】3、适用范围
@target 元注解,表示自定义注解应用的范围
@Target(ElementType.METHOD) --- 方法上@Target(ElementType.TYPE) --- 类上
为注解增加属性
设值的时候,当作方法。 赋值的时候, 当作属性,调用时 是方法
public @Interface ItcastAnnotation{
String color();
}
@ItcastAnnotation(color: "red");
public class AnnotationTest{
public static void main(String []args){
if(AnnotationTest.class.isAnnotationPresent(ItacaseAnnotation.class)){
ItcastAnnotation ia = ()AnnotationTest.getA
}
}
}
要实现一个自定义注解,必须通过 @interface 关键字来定义。且在 @interface 之前,需要通过元注解来描述该注解的使用范围( @Target )、生命周期( @Retention )
【自定义注解】
【A】自定义注解类
【A】自定义注解类
//
//1、通过注解设定 本注解 处于RUNTIME 运行时的阶段
@Retention(RetentionPolicy.RUNTIME)
//1-2 通过 @interface 自定义一个注解
public @interface ItcastAnnotation {
// 为注解添加 属性
//2 添加一个color 并通过 default 设定 缺省值(即默认的值)
String color() default "blue";
//3 value 比较 特殊,单独时,可以直接写值 ,不用 value=""
String value();//
//4 添加一个 数组类型 没有 缺省值
int [] arrayAttr();
//5 枚举 类型 之前 专注总结 枚举的时候,写过的一个高级枚举:
EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;
//6 注解类型 注解中的注解 设定 缺省值
MetaAnnotation annotationAttr() default @MetaAnnotation("mmmmmmmm");
//7 添加一个 Class字节码文件
Class className();
}
【B】 ItcastAnnotation 的测试类
//1、使用自定义注解 @ItcastAnnotation,其中有很多属性
@ItcastAnnotation(annotationAttr=@MetaAnnotation("aaaaa"),value = "abc",arrayAttr=2,className=String.class)
public class AnnotationTest {
//2 特殊属性(方法) value
//@ItcastAnnotation("abc")//当注解方法只有value、或者其他都有缺省时,可以这么写
public static void main(String[] args) throws Exception
{
// TODO Auto-generated method stub
//3-1、过时的方法
System.runFinalizersOnExit(true);
//3-3、设置方法过时
sayHelle();
//4-1、(证明注解也是一个类)。
// 先得到AnnotationTest字节码 检测是否有注解
if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){
//4-2 既然注解是一个类, 创建一个对象
ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
//System.out.println(annotation);
//4-3 color 在应用注解的时候没有设值 所以这里会引用 缺省值
System.out.println("color: "+annotation.color());
System.out.println("value: "+annotation.value());
System.out.println("arrayAttr.length: "+annotation.arrayAttr().length);
//4-4 把arrayAttr 进行转换 ,并打印
List<int []> lists = Arrays.asList(annotation.arrayAttr());
for(int [] list : lists){
for(int li : list){
System.out.print(li+" >");
}
}
//4-5 枚举 类型 之前 专注总结 枚举的时候,写过的一个高级枚举
System.out.println("\nEnumTest.TrafficLamp: "+annotation.lamp().nextLamp().name());
//4-6 注解中的 注解
System.out.println("annotationAttr.value: "+annotation.annotationAttr().value());
}
}
//3-2、设置方法过时
@Deprecated
public static void sayHelle(){
System.out.println("唉,哥辉煌的时代已然过去鸟。");
}
注解可以看成是一个接口,注解实例就是一个实现了该接口的动态代理类。
注解大多是用做对某个类、方法、字段进行说明,标识的。
以便在程序运行期间我们通过反射获得该字段或方法的注解的实例,来决定该做些什么处理或不该进行什么处理
---------------------------------------------------------------------------------------------------------------------------------------------
----------
android培训、
java培训、期待与您交流!----------
----------------------------------------------