首页 > 编程语言 >【JavaSE】Java注解

【JavaSE】Java注解

时间:2024-09-22 20:20:02浏览次数:9  
标签:Java String java public 注解 JavaSE ElementType class

什么是注解 

        我们最早使用的注解有:方法重写 @Override,在编译期间进行硬性检测,加在方法上就表明该方法是从父类重写过来的。

        Java 注解(Annotation)又称 Java 标注,它可以用来对类、方法、属性、参数、包等进行标注,然后让编译器或运行时其他类进行解析,完成某个功能,注解也可以编译到字节码文件中。 当然它也支持自定义 Java 标注。

内置注解

        Java 语言中已经定义好的注解。

        @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。

        @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。

        @SuppressWarnings - 指示编译器去忽略注解中声明的警告。

        @FunctionalInterface 用于指示被修饰的接口是函数式接口。

元注解

        元注解是 java API 提供的,是用于修饰注解的注解,通常用在注解的定义上。

@Target(ElementType.METHOD) // 定义这个注解只能用在方法上
@Retention(RetentionPolicy.SOURCE) // 定义这个注解在源文件中有效(编译期间)
public @interface Override {
}

        @Retention - 标识这个注解怎么保存,是只在代码中,还是编入 class 文件中,或者是在运行时可以通过反射访问。

        @Documented - 标记这些注解是否包含在用户文档中。

        @Target - 标记这个注解应该是哪种 Java 成员。

        @Inherited - 标记这个注解是继承于哪个注解类(默认注解并没有继承于任何类)

        @Repeatable - 标识某注解可以在同一个声明上使用多次。

重点掌握

        @Target:用于描述注解的使用范围(即:被描述的注解可以用在什么地方.         ElementType.TYPE 可以应用于类的任何元素。
        ElementType.CONSTRUCTOR 可以应用于构造函数。
        ElementType.FIELD 可以应用于字段或属性。
        ElementType.LOCAL_VARIABLE 可以应用于局部变量。
        ElementType.METHOD 可以应用于方法级注释。
        ElementType.PACKAGE 可以应用于包声明。
        ElementType.PARAMETER 可以应用于方法的参数。

        @Retention:@Retention 定义了该注解被保留的时间长短:某些注解仅出现在源代码中,而被编译器丢弃;而另一些却被编译在 class 文件中;编译在 class文件中的注解可能会被虚拟机忽略,而另一些在 class 被装载时将被读取(请注意并不影响 class 的执行,因为注解与 class 在使用上是被分离的)。用于描述注解的生命周期(即:被描述的注解在什么范围内有效)取值有:
        1.SOURCE:在源文件中有效(即源文件保留)
        2.CLASS:在 class 文件中有效(即 class 保留)
        3.RUNTIME:在运行时有效(即运行时保留)

自定义注解

package annotation;

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


@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NotNull {

    String message() default "";

    int length() default 0;

    String lengthmessage() default "";
	
}
package annotation;

public class User {

    private int num;

    @NotNull(length = 2, message = "名字不能为空", lengthmessage = "名字不能小于2位")
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

}
package annotation;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test {

    public static void main(String[] args) throws NoSuchMethodException, SecurityException, Exception {
        User user = new User();
        user.setName("j");
        Field[] fields = user.getClass().getDeclaredFields(); // 通过反射拿到类中所有的属性
        for (Field field : fields) { // 循环所有的属性
            NotNull notNull = field.getAnnotation(NotNull.class); // 获取属性上的指定的注解
            if (notNull != null) {
                // 通过name属性名字获得对应的get方法名字,再用get方法名字获得方法
                Method m = user.getClass().getMethod("get" + getMethodName(field.getName()));
                Object obj = m.invoke(user); // 调用获得到的方法,获得返回值
                if (obj == null) {
                    System.err.println(field.getName() + notNull.message()); // 获取注解属性值
                    throw new NullPointerException(notNull.message());
                } else {
                    if (String.valueOf(obj).length() < (notNull.length())) {
                        System.err.println(field.getName() + notNull.lengthmessage());
                    }
                }
            }
        }
    }

    /**
     * 把一个字符串的第一个字母大写
     */
    private static String getMethodName(String fildeName) throws Exception {
        byte[] items = fildeName.getBytes();
        items[0] = (byte) ((char) items[0] - 'a' + 'A');
        return new String(items);
    }
    
}

标签:Java,String,java,public,注解,JavaSE,ElementType,class
From: https://blog.csdn.net/qq_58023907/article/details/142442296

相关文章

  • Java 方法传参机制
    普通变量传参在Java中,一个方法可以选择需要参数或者无需参数,当方法需要参数时,传入参数都发生了什么变化是一个非常值得研究的问题,由此而来,我已自己所学来简单讲解一下其中的机制。实例1这是一个交换两个数值的方法,方法传入了两个形参a和b,交换之后并打印出来。class......
  • 基于Java Springboot 超市云购物系统
    一、作品包含源码+数据库+设计文档万字+全套环境和工具资源+部署教程二、项目技术前端技术:Html、Css、Js、Vue3、Element-ui数据库:MySQL后端技术:Java、SpringBoot、MyBatis三、运行环境开发工具:IDEA数据库:MySQL8.0数据库管理工具:Navicat10以上版本环境配置软件:JDK......
  • 基于Java Springboot 共享单车管理系统
    一、作品包含源码+数据库+设计文档万字+PPT+全套环境和工具资源+部署教程二、项目技术前端技术:Html、Css、Js、Vue3、Element-ui数据库:MySQL后端技术:Java、SpringBoot、MyBatis三、运行环境开发工具:IDEA数据库:MySQL8.0数据库管理工具:Navicat10以上版本环境配置软件......
  • 基于Java Springboot 中医学习服务管理系统
    一、作品包含源码+数据库+设计文档万字+全套环境和工具资源+部署教程二、项目技术前端技术:Html、Css、Js、Vue3、Element-ui数据库:MySQL后端技术:Java、SpringBoot、MyBatis三、运行环境开发工具:IDEA数据库:MySQL8.0数据库管理工具:Navicat10以上版本环境配置软件:JDK......
  • 基于Java Springboot 共享单车管理系统
    一、作品包含源码+数据库+设计文档万字+PPT+全套环境和工具资源+部署教程二、项目技术前端技术:Html、Css、Js、Vue3、Element-ui数据库:MySQL后端技术:Java、SpringBoot、MyBatis三、运行环境开发工具:IDEA数据库:MySQL8.0数据库管理工具:Navicat10以上版本环境配置软件......
  • Java创建接口详细过程
    在Java中,创建mapper、dao(数据访问对象)、service、serviceImpl(service实现类)、controller等组件是构建企业级应用常见的分层架构模式。这种分层架构有助于实现高内聚低耦合的设计,提高代码的可维护性和可扩展性。mapperrXML文件创建MapperXML文件用于定义Java对象和数据库表......
  • 从代码到部署:GitHub Actions实现Java项目CI/CD的完整实践
    从代码到部署:GitHubActions实现Java项目CI/CD的完整实践在现代软件开发中,持续集成和持续部署(CI/CD)已经成为了团队高效交付代码的关键策略。通过GitHubActions,可以轻松配置CI/CD流水线,实现从代码提交到部署的自动化工作流。本文将基于英语听力网站(studytool.site)项目介......
  • Java反射机制
    1、什么是Java反射机制?Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。2、......
  • Spring Boot 注解拦截器实现审计日志功能
    引言在业务系统中,审计日志记录至关重要。系统需要记录用户的操作日志,特别是在用户操作数据库修改、查询、删除重要数据时,系统应追踪操作人的身份、操作的对象、操作的时间等关键数据。这不仅对运维、合规性有帮助,同时也能提高系统的可审计性和安全性。本篇文章将深入讲解......
  • 使用java做一个微信机器人
    微信机器人这个功能,目前在市面上运用的还是不是很多,每个人实现机器人的目的也不一样,有的为了自动加好友;有的为了自动拉群:也有的为了机器人对话聊天等等一系列。想必大家对微信机器人感兴趣的伙伴,也在aithub上面搜索了很多吧,但是大多数走到一半遇到各种bug就没有继续坚持走下去,原......