JAVA-注解篇
一、什么是注解?
注解 Annotation也一种引用类型数据,在编译后同样会生成.class文件,注解可以述程序所需要的信息,注解API在java.lang.annotation下
二、注解有什么用?
注解可以减轻眼样板“代码”的负担,使用注解可以使代码干净易懂,可以在编译期对数据进行检查、验证和测试。
三、注解的语法?
声明一个注解类:
[修饰符列表] @Interface 注解名 {
//注解内容…
}
四 、注解可以使用在那些位置?
注解可以使用在 类之上,方法之上,属性之上,形式参数列表之中, 注解之上、注解类之上 等等。。。
五、java中常用的注解?
(补充中…)
java.long 包下(仅仅包含需要掌握的)
注解 | 释意 |
---|---|
@Deprecated | 注释@Deprecated的程序元素是程序员不鼓励使用的程序元素,通常是因为它是危险的,或者因为存在更好的替代方法。 编译器在不被弃用的代码中使用或覆盖不推荐使用的程序元素时发出警告。 |
@Override | 表示方法声明旨在覆盖超类型中的方法声明。 如果使用此注释类型注释方法,则除非至少满足以下条件之一,否则需要编译器生成错误消息:1.该方法将覆盖或实现在超类型中声明的方法。2.该方法具有与Object中声明的任何公共方法的覆盖相同的签名 。 |
六、注解中的元注解?
元注解是java注解的基石他声明了注解类的使用规则,注解使用时的位置,和注解使存在的位置,元注解只能出现在注解类之上以声明注解类的使用规则。元注解的值皆为枚举。
(!!!仅包含常用的注解)
元注解 | 注解说明 | 保持性策略 | 注解可以出现的位置 | |
---|---|---|---|---|
@Retention | 规定此注解的保持性策略 | RetentionPolicy .SOURCE(保存在原文件中)RetentionPolicy .RUNTIME(保存在class文件中且可以被反射机制读取到) RetentionPolicy .CLASS (保存在class文件中) | – | |
@Target | 规定此注解可以在类的那些位置使用 | — | TYPE(类、接口包括注解类型或枚举声明) FIELD,(字段声明包括枚举常量) METHOD(方法之上) PARAMETER,(形式参数列表之中) CONSTRUCTOR(构造函数之上)LOCAL_VARIABLE(局部变量之上)ANNOTATION_TYPE,(注解类之上) PACKAGE(包之上) TYPE_PARAMETER(类型参数声明) TYPE_USE(类型的使用) |
七、自定义注解的示例?
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
@Retention(RetentionPolicy.RUNTIME) //使注解可以被反射机制读取到
@Target(value={TYPE,METHOD}) //声明注解可以使用的位置 可以出现在方法上、类上(未省略value)
public @interface MyAnnotation {
/** 注意!!!
* 注解中的属性支持哪些类型?
* 支持八种基本数据类型、String、Class Enum,以及这些类型的数组 例如: Class[] name
* */
/*
* 通常我们可以在注解类中声明属性,(称为属性而非方法)
* 在使用此注解类时如果此注解类拥有属性则必须为属性赋值,例如:@MyAnnotation(name = "李四")
* */
String name();
/*
* 在属性指定了默认值时,在使用注释类时可以不再为此属性声明值,则使用默认值*/
int age() default 18;
/*
* 当且仅当属性名为 value 时属性名可以省略,例如:@MyAnnotation("我是省略属性名的值")
* */
String value();
/*
* 属性可以为数组 在为此属性赋值时如果数组中有多个元素时 为数组指定值
* 例如:@MyAnnotation(hobby = {"写代码","打游戏","看文档"})
* 当只有一个元素时则可以省略大括号 例如:@MyAnnotation(hobby = "写代码")
* */
String[] hobby();
}
省略了使用章节!
八、如何使用自定义注解?
@MyAnnotation(name= "张三",hobby = {"吃饭","喝水"},value = "abc")
public class MyClass {
/*@MyAnnotation(name= "张三",hobby = {"吃饭","h喝水"},value = "abc")*/
public void test(){};
/*可以使用在方法上或类上或二者同时存在,其他位置使用方法皆相同*/
}
九、如何使用反射获取注解?
public class ReflectionAnnotation {
/*通过反射获取注解*/
public static void getAnnotation() throws ClassNotFoundException {
Class<?> s = Class.forName("MyClass");//获取类的反射对象
if(s.isAnnotationPresent(MyAnnotation.class)){ //查看类上是否有某个注解
MyAnnotation annotation = s.getAnnotation(MyAnnotation.class); //获取注解对象
System.out.println(annotation.value());//获取注解的属性值 abc
System.out.println(annotation.name());//获取注解的属性值 张三
}
}
public static void main(String[] args) {
try {
getAnnotation();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
欢迎指正欢迎补充,暂未完结。。。