Java注解

Java注解,第1张

Java注解 1:什么是注解

jdk1.5新特性 ,可以在认为位置任意位置敲写
语法: @注解名(实参)
如:@Override

2:注解的作用

1.注释,解释的作用
2.标志检查的作用
3.添加注解的时候可以通过配置传递参数,运行期间通过反射获取到配置的数据,程序中进行使用
4.注解可以存在与Class文件中
5.注解大量的代替了配置文件的存在

3:注解的分类
按照注解中传递参数分类
	标记注解 : 没有参数
    单值注解 : 一个参数
    完整注解 : 多个参数
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;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5693349.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存