栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【动力节点 Java进阶学习笔记】第九章 注解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【动力节点 Java进阶学习笔记】第九章 注解

【动力节点 Java进阶学习笔记】第九章 注解

1、什么是注解、注解的作用,以及如何自定义注解和使用注解2、内置注解:Deprecated和Override3、元注解:Target和Retention4、注解中定义属性:怎么定义、默认值、value省略属性名、属性支持的类型、数组属性5、反射注解6、反射在开发中的作用示例

1、什么是注解、注解的作用,以及如何自定义注解和使用注解

注解的定义:
       注解其实就是代码中的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相对应的处理
       注解Annotation是一种引用数据类型注解的作用:
       编写文档:通过代码里标识的元数据生成文档。
       代码分析:通过代码里标识的元数据对代码进行分析,替代配置文件。
       编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查。自定义注解:
[修饰符列表]   @interface   注解类型名{}注解使用:
       使用方法:@注解类型名
       使用位置:注解可以出现在类上、属性上、方法上、变量上等…注解还可以出现在注解类型上 2、内置注解:Deprecated和Override

       Override注解:只能注解方法,编译器会自动检查该方法是否重写了父类的方法
       Deprecated注解:表示已废弃、暂时可用,不建议使用

3、元注解:Target和Retention

元注解的定义:用来标注“注解类型”的“注解”,称为元注解。Target注解
       用来标注“被标注的注解”可以出现在哪些位置上。
       @Target(ElementType.METHOD)Retention注解
       用来标注“被标注的注解”最终保存在哪里
       @Retention(RetentionPolicy.SOURCE):表示该注解只被保留在java源文件中。
       @Retention(RetentionPolicy.CLASS):表示该注解被保存在class文件中。
       @Retention(RetentionPolicy.RUNTIME):表示该注解被保存在class文件中,并且可以被反射机制所读取。 4、注解中定义属性:怎么定义、默认值、value省略属性名、属性支持的类型、数组属性

格式:<数据类型> <数据类型名>()        如:String name()使用default指明默认值:<数据类型> <数据类型名>() default <数据值>       如:String name() default “bob”如果一个注解的属性的名字是value,并且只有一个属性的话,在使用的时候,该属性名可以省略。属性的类型可以是:基本数据类型、 String、Class、枚举类型以及它们的数组形式 5、反射注解

前提:元注释Retention属性设置为RUNTIME判断是否存在某注解:isAnnotationPresent(注解.class);如:c.isAnnotationPresent(MyAnnotaion2.class)获取某注解:getAnnotation(注解.class);如:MyAnnotaion2 at = (MyAnnotaion2)c.getAnnotation(MyAnnotaion2.class)获取该注解中的属性:<注解类型对象>.<属性名()> ;如:myAnnotation.value() 6、反射在开发中的作用示例

自定义注解,表明必须有ID这个属性

package com.javalearn.javase.review.annotation.annotation3;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MustHasIdPropertyAnnotation {
}

自定义异常,当使用自定义注解但是未定义ID属性时抛出该异常

package com.javalearn.javase.review.annotation.annotation3;

public class HasNotIdPropertyException extends RuntimeException{
    public HasNotIdPropertyException() {
    }

    public HasNotIdPropertyException(String s) {
        super(s);
    }
}

定义使用自定义注解的User类

package com.javalearn.javase.review.annotation.annotation3;

@MustHasIdPropertyAnnotation
public class User {
//    int id;
    String id;
    String name;
    String password;
}

编写测试程序进行测试

package com.javalearn.javase.review.annotation.annotation3;

import java.lang.reflect.Field;

public class AnnotationTest {
    public static void main(String[] args) {
        Class c = null;
        try {
             c = Class.forName("com.javalearn.javase.review.annotation.annotation3.User");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        if (c.isAnnotationPresent(MustHasIdPropertyAnnotation.class)) {
            Field[] fields = c.getDeclaredFields();
            boolean isOk = false;
            for (Field field:fields) {
                if ("id".equals(field.getName()) && "int".equals(field.getType().getSimpleName())) {
                    isOk = true;
                    break;
                }
            }
            if (!isOk) {
                throw new HasNotIdPropertyException("被@MustHasIdPropertyAnnotation注解标注的类中必须要有一个int类型的id属性!");
            }
        }
    }
}

此时运行结果为:

Exception in thread "main" com.javalearn.javase.review.annotation.annotation3.HasNotIdPropertyException: 被@MustHasIdPropertyAnnotation注解标注的类中必须要有一个int类型的id属性!
	at com.javalearn.javase.review.annotation.annotation3.AnnotationTest.main(AnnotationTest.java:23)

Process finished with exit code 1
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/764388.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号