注解 (有图有例解释)

注解不是注释,注释是程序员写的,给程序员看的。注解给程序看,用于描述程序如何运行及在什么阶段来运行。
现在在实际开发中,注解最大的功能是用于替换配置文件


注解是jdk1.5的新特性。
可以通过反射来让注解具有功能
注解格式: @Xxxx

2.1 JDK中的三个基本的注解:

    a. @Override   检查子类确实是覆盖了父类的方法。
    b. @Deprecated   说明已经过时了。
    c. @SuppressWarnings({ "unused", "deprecation", "rawtypes" })   抑制程序中的警告。unused(变量未使用)deprecation(过时)rawtypes(泛型)表示警告的类型。{}数组。
    d. @SuppressWarnings("all")  all抑制所有警告。

    示例代码如下:

package com.itheima.demo1;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class Demo1 {
// @SuppressWarnings({ "unused", "deprecation", "rawtypes" })
@SuppressWarnings("all")
public void ff() {
int i = 0;
System.out.println("abc");
List list = new ArrayList();
System.out.println(new Date().toLocaleString());
}
public void HaHa() {
}
}
class Demo2 extends Demo1 {
@Override
public void ff() {
}
@Deprecated
public void HaHaHa() {
System.out.println(new Date().toLocaleString());
}
}

2.2 自定义注解的语法(注解的肉体

    研究一下注解的本质:
        声明一个注解(或者创建一个注解类): @interface 注解名{…}

public @interface MyAnnotation {}

    通过反编译可知,注解它的本质就是一个接口,这个接口需要继承 Annotation接口。但是不能按照下述的代码格式写,需要按照上述代码格式写。

public interface MyAnnotation extends java.lang.annotation.Annotation {...}

    分析注解类中的成员:
        注解本质上就是接口,我们知道接口中可以有属性和方法。
            属性:public static final int age;
            方法:public abstract void show();

        但是在注解中也可以有属性,也可以有方法。但是,注解中一般不使用属性。
        在注解的开发中,我们只写方法。
        我们管注解中的方法,叫做注解的属性。
        在注解中我们管方法的返回值叫做注解的类型。
            注解定义属性的格式 : 例如:int age();

    关于注解的属性类型可以有哪些?
        1. 基本类型
        2. String
        3. 枚举类型
        4. 注解类型
        5. Class类型
        6. 以上类型的一维数组类型

    注解:就是在你的程序代码中的某个位置加了一个标记而已。

   示例代码如下图所示:

2.3 注解的反射(注解的灵魂)

    模拟 Junit 的 @Test 方法

   a、反射注解类
   java.lang.reflect.AnnotatedElement;
      < T extends Annotation > T getAnnotation(Class< T > annotationType)   得到指定类型的注解引用。没有,返回null。
      Annotation[] getAnnotations()   得到所有的注解,包含从父类继承下来的。
      Annotation[] getDeclaredAnnotations()   得到自己身上的注解。
      boolean isAnnotationPresent(Class< ? extends Annotation > annotationType)   判断指定的注解有没有。

    ClassMethodFieldConstructor等实现了AnnotatedElement接口
    例如:
      Class.isAnnotationPresent(MyTest.class);     判断类上面有没有@MyTest注解。
      Method.isAnnotationPresent(MyTest.class);     判断方法上面有没有@MyTest注解。

    b、反射注解中的属性
    如下图元注解图片中所示:

2.4 元注解

    a、自定义注解的存活范围(生命周期):默认是CLASS。


    什么是 元注解 ? 答:只能用在注解类上的注解叫做元注解。(即:用于 修饰注解的注解

 

  • @Retention 作用:改变自定义注解的存活范围。
      RetentionPolicy
        SOURCE
        CLASS
        RUNTIME
      例如:@Retention(RetentionPolicy.RUNTIME)

  • @Target 作用:指定该注解能用在什么地方。
      ElementType
        TYPE
        METHOD
        FIELD
        ANNOTATION_TYPE
      例如:@Target({ ElementType.METHOD, ElementType.TYPE })

  • @Documented 作用:使用了@MyTest的注解的类,如果@MyTest注解类上面有@Documented注解,那么使用了@MyTest的注解的类的API文档中会出现@MyTest的身影。

  • @Inherited 作用:说明使用了该注解的类的子类可以继续使用该注解。

    示例代码如下图所示:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的上传片到服务器的Java代码,带有注释: ```java import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.UUID; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; @RestController public class FileUploadController { // 设置上传文件的保存路径 private static String UPLOAD_DIR = "uploads/"; // 处理文件上传请求的方法 @PostMapping("/upload") public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file) { try { // 获取上传文件的原始文件名 String originalFileName = file.getOriginalFilename(); // 获取上传文件的后缀名 String fileExtension = originalFileName.substring(originalFileName.lastIndexOf(".")); // 生成唯一的文件名 String newFileName = UUID.randomUUID() + fileExtension; // 设置上传文件的保存路径和文件名 String uploadFilePath = UPLOAD_DIR + newFileName; // 获取上传文件的输入流 InputStream fileInputStream = file.getInputStream(); // 创建保存上传文件的目录 Path uploadDirPath = Paths.get(UPLOAD_DIR); if (!Files.exists(uploadDirPath)) { Files.createDirectories(uploadDirPath); } // 将上传文件保存到服务器 Files.copy(fileInputStream, Paths.get(uploadFilePath)); // 返回上传成功的响应 return ResponseEntity.ok().body("File uploaded successfully: " + uploadFilePath); } catch (IOException e) { // 返回上传失败的响应 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Failed to upload file"); } } } ``` 这是一个基于Spring Framework的文件上传控制器,使用了Spring的MultipartFile API处理文件上传。在代码中,我们首先设置了上传文件的保存路径,并定义了`handleFileUpload`方法来处理文件上传请求。在方法中,我们通过`file.getOriginalFilename()`方法获取上传文件的原始文件名,并通过`UUID.randomUUID()`方法生成了一个唯一的文件名,然后将上传文件保存到服务器上的指定目录中。最后,我们返回一个上传成功的响应或者上传失败的响应,具体取决于上传是否成功。 需要注意的是,上传文件的保存路径应该是一个绝对路径,可以根据具体项目的需要进行配置。在本中,我们将上传文件保存到了当前项目的`uploads/`目录下。同时,为了避免上传文件的重名问题,我们使用了`UUID.randomUUID()`方法生成唯一的文件名。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值