2:注解的作用jdk1.5新特性 ,可以在认为位置任意位置敲写
语法: @注解名(实参)
如:@Override
3:注解的分类1.注释,解释的作用
2.标志检查的作用
3.添加注解的时候可以通过配置传递参数,运行期间通过反射获取到配置的数据,程序中进行使用
4.注解可以存在与Class文件中
5.注解大量的代替了配置文件的存在
按照注解中传递参数分类
标记注解 : 没有参数
单值注解 : 一个参数
完整注解 : 多个参数
4:原注解
4.1:什么事原注解
4.2:原注解作用原注解用来修饰自己定义的注解【注解”注解“的注解】
原注解 : 注解注解的注解
@Target 用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
@Retention 表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有)
@documented 表示使用该注解的元素应被javadoc或类似工具文档化
@Inherited 表示一个注解类型会被自动继承,
4.3:使用原注解配置自定义注解特点
自定义注解 :
1.通过@interface自定义注解类型
2.自定义的注解类型默认实现java.lang.annotation Annotation接口
3.自定义的注解类型不能显示的继承其他父类,实现其他接口
4.注解类中可以定义注解类型的字段,特殊的定义方法,需要字段名后面添加() --> 修饰符 类型 字段名();
5.如果注解类型中只有一个字段,建议这个字段名定义为value,赋值的时候可以直接赋值
6.注解类型中的字段的数据类型,只能为以下几种类型 : 基本数据类型,String,Annotation,枚举类型,或者这几种类型的数组
7.字段的修饰符只能为public|default
8.通过default关键字为字段定义默认值
public class Class003_Defined {
//默认给value这个字段复制,如果字段不交value,就需要j=1这种格式
@MyAnnotation("zhangsan")
String name;
}
//这个注解可以写在那个位置
@Target(ElementType.FIELD)
//这个注解运行时间
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{
//数据后面需要加()
String value();
//defaul表示这个值可以不配置,会有默认值
int j() default -1;
}
4.4使用自定义注解Demo
public class Class004_FruitList {
public static void main(String[] args) throws Exception {
FruitList list = new FruitList();
list.pair = 15;
System.out.println(list);
testFruitList(list,FruitList.class);
System.out.println(list);
}
//注解解析器 : 获取当前对象的每一个属性,判断属性是否存在指定的上货数量,如果没有存在,进一步判断是否存在默认的上货数量,存在获取数量进行复制,不存在不上货
public static FruitList testFruitList(FruitList list,Class cls) throws Exception {
//判断是否存在水果清单的实例
if(list==null){
throw new NullPointerException("哪有清单!!!!");
}
//获取水果清单类型中的所有属性
Field[] fields = cls.getDeclaredFields();
//遍历每一个属性
for(Field field:fields){
//判断list清单中当前属性是否已经赋值,已经赋值就按照当前已经赋予的值上货
if(field.get(list)==null){
//没有赋值,判断当前属性上是否存在Num注解,如果不存在证明没有默认值
if(field.isAnnotationPresent(Num.class)){
//如果存在,获取默认值,赋值给list对象当前属性
Num num = field.getAnnotation(Num.class);
field.set(list,num.value());
}
}
}
return list;
}
}
//水果清单 :类型
class FruitList{
@Num(20)
Integer apple;
@Num
Integer pair;
Integer banana;
public FruitList() {
}
public FruitList(Integer apple, Integer pair, Integer banana) {
this.apple = apple;
this.pair = pair;
this.banana = banana;
}
@Override
public String toString() {
return "FruitList{" +
"apple=" + apple +
", pair=" + pair +
", banana=" + banana +
'}';
}
}
//注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Num{
int value() default 10;
}



