Java 简单笔记——注解

33 篇文章 0 订阅

一、概述

  • 从JDK5.0开始,Java新增加了对元数据(MetaData)的支持,也就是注解(Annotation)
  • 注解其实就是代码中的特殊标记,这些特殊标记可以在类加载、编译、运行时被读取,并执行相应的处理。使用注解最大的作用就是在不改变原程序逻辑的情况下添加补充信息。
  • Annotation可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明,这些信息被保存在Annotation的 “name=value” 对中。
  • Annotation 能被用来为程序元素(类、方法、成员变量等)设置元数据。
  • 上面的概念都是我抄的,如果看不懂没关系,只要知道注解是一种标记,继续往下看就行~~

二、三个基本的Annotation

Java中有三个基本的注解:

1.@Override

@Override的作用是基于继承,并且该注释只能 用于方法,其总用是限定重写父类的方法

举个例子:

1.先创建一个类,提供方法;

class Person{  
    public String walk() {
        return "Max";
    }
}

2.声明一个子类,并使其继承该类,并重写方法;
为了区分两个方法不同,我将子类的返回值设置为“Hello”;

class Student extends Person{

    public String walk() {
        return "Hello";
    }    
}

3.然后,在入口中进行虚拟方法调用

public class Main {
    public static void main(String[] args){
      Person stu=new Student();
      System.out.println(stu.walk());
    }
}

测试:
在这里插入图片描述
很明显,父类的引用指向子类的实体,也就是虚拟方法调用,输出的结果是子类重写的方法;

但是,如果我不小心把子类中重写的方法写成wa1k呢?(本该是walk,这里将字母l写成了数字1
在这里插入图片描述
实际执行的方法就变成了父类的原方法;

由于IDEA的强大,我们在这里可以很清楚的看到提示——子类重写的方法并没有被调用;
在这里插入图片描述
可是如果我们用的不是IDEA呢?如果我们的程序很庞大呢?
这个可能会出现的错误又因为没有违反逻辑或编译错误所以不会终止程序也不会报错。

是不是很头疼?

好了,这时候终于轮到@Override登场了

前面说到@Override的作用是限定重写父类的方法,其实就是这个意思~

我们在子类的重写方法的前面添加了@Override
在这里插入图片描述
可以看到,当子类的方法确实为父类方法的重写时(两个方法名字一样),没有任何问题。

当子类的方法不为父类方法的重写但是又添加了@Override时,编译器报错了。
在这里插入图片描述
并且是一个致命的错误;
在这里插入图片描述

2.@Deprecated

@Deprecated作用是表示某个程序元素(类、方法等)已经过时或者即将被淘汰。

再举个很形象的例子~

如图:
在这里插入图片描述
没错,@Deprecated的出现就意味着它标志的程序元素像房子一样被写了一个“拆”字;该程序元素(类、方法等)已经或者将要被淘汰,会有新的程序元素来实现该程序元素的功能。

但是,被标记的程序并非不能使用,@Deprecated并没有强制性,它只是一种标记在这里插入图片描述
在程序开发过程中,我们要尽可能的避免使用被@Deprecated所标记的程序元素;
1.被标记就代表会被淘汰,使用被淘汰程序元素的程序在新的JDK中会报错;
2.只要是被标记程序元素就一定可以找到替代的程序元素;

总之:被@Deprecated标记就像自己的房子被写了“拆”,虽然目前还是可以居住但是尽量不要,万一某一天就塌了…
不过,只要是被写了“拆”的房子,政府或者企业一定会给一套新的更好的住所。


3.@SuppressWarnings

@SuppressWarnings的出现在我看来主要是对程序开发者的一种“慰藉”,其作用是抑制编译器警告

要知道,编译器警告这玩意说他有没用吧,有些时候确实能帮助我们避免很多错误;要说他有用吧,有些时候明明程序没有问题可以正常跑,但是他还是在哪里显示一个黄色叹号,看起来很烦!!!

于是乎,对于一些我们确信的没必要的提示信息,我们便可以使用@SuppressWarnings

例如:我在这里定义了一个变量 i,但是我没有使用它,编译器便会发出警告
在这里插入图片描述
这时候,我们就可以使用@SuppressWarnings
在这里插入图片描述

关于@SuppressWarnings括号里面的内容应该写什么,这里有一张表格附上:
(表格并非原创,来源如下)
表格来源

关键字用途
allto suppress all warnings(抑制所有警告)
boxingto suppress warnings relative to boxing/unboxing operations(要抑制与箱/非装箱操作相关的警告)
castto suppress warnings relative to cast operations(为了抑制与强制转换操作相关的警告)
dep-annto suppress warnings relative to deprecated annotation(要抑制相对于弃用注释的警告)
deprecationto suppress warnings relative to deprecation(要抑制相对于弃用的警告)
fallthroughto suppress warnings relative to missing breaks in switch statements(在switch语句中,抑制与缺失中断相关的警告)
finallyto suppress warnings relative to finally block that don’t return(为了抑制警告,相对于最终阻止不返回的警告)
hidingto suppress warnings relative to locals that hide variable(为了抑制本地隐藏变量的警告)
incomplete-switchto suppress warnings relative to missing entries in a switch statement (enum case)(为了在switch语句(enum案例)中抑制相对于缺失条目的警告)
nlsto suppress warnings relative to non-nls string literals(要抑制相对于非nls字符串字面量的警告)
nullto suppress warnings relative to null analysis(为了抑制与null分析相关的警告)
rawtypesto suppress warnings relative to un-specific types when using generics on class params(在类params上使用泛型时,要抑制相对于非特异性类型的警告)
restrictionto suppress warnings relative to usage of discouraged or forbidden references(禁止使用警告或禁止引用的警告)
serialto suppress warnings relative to missing serialVersionUID field for a serializable class(为了一个可串行化的类,为了抑制相对于缺失的serialVersionUID字段的警告)
static-accesso suppress warnings relative to incorrect static access(o抑制与不正确的静态访问相关的警告)
synthetic-accessto suppress warnings relative to unoptimized access from inner classes(相对于内部类的未优化访问,来抑制警告)
uncheckedto suppress warnings relative to unchecked operations(相对于不受约束的操作,抑制警告)
unqualified-field-accessto suppress warnings relative to field access unqualified(为了抑制与现场访问相关的警告)
unusedto suppress warnings relative to unused code(抑制没有使用过代码的警告)

另外,@SuppressWarnings内部可以有多个属性同时存在,其格式如下:
在这里插入图片描述

三、如何自定义注解

自定义一个注解很简单,其用到的关键字为@interface

public @interface Main {
      String value() default "hello";
       String[] value1() default {"word","hello"};
}

其中,String表示注解的类型,如果注解有多个内容,即为数组;
value()可以看作是属性,default后面的内容为默认值;

定义好了以后便可以使用:
在这里插入图片描述
可以看到,没什么效果;

那怎么样才能有效果?

不急,我们先看一下Java中注解的源码(@SuppressWarnings的源码);
在这里插入图片描述
可以看到,除去不影响程序注释(注意不是注解),@SuppressWarnings的源码格式和我们自定义的几乎一样,唯一的区别就是在于上面的两行代码;
在这里插入图片描述
没错,也就是这两行代码发挥了作用,使得注解有了效果。

这两行代码又有一个新名字——元注解

四、元注解

作用:JDK的元Annotation用于修饰其它的Annotation
分类:Java中提供了4种元注解:@Target@Retention@Documented@Inherited

1.@Target

作用:@Target表示注解可以被使用的地方(作用域),其用法是使用枚举类ElemenetType中的参数;
在这里插入图片描述
也可以这样(注意看包):
在这里插入图片描述

ElemenetType中的参数及其作用如下:

参数目标(作用域)
ElementType.TYPE类、枚举类、接口
ElementType.FIELD字段、枚举的常量
ElementType.METHOD方法
ElementType.PARAMETER方法参数
ElementType.PACKAGE
ElementType.ANNOTATION_TYPE注解
ElementType.LOCAL_VARIABLE局部变量
ElementType.CONSTRUCTOR构造函数

(表格非原创,数据来源于:Java注解

2.@Retention

作用:限定注解写在什么级别的位置上(注解的保留位置),也可以理解为被修饰注解的生命周期(保存时间)的长度;其用法是使用枚举类型 RetentionPolicy中的参数;
在这里插入图片描述
RetentionPolicy的参数及作用如下:

参数目标(作用域)
RetentionPolicy.SOURCE注解仅存在于源码中,在class字节码文件中不包含;即在编译的时候不考虑;
RetentionPolicy.CLASS默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得;
RetentionPolicy.RUNTIME注解会在class字节码文件中存在,在运行期间也保留并可以通过反射获取到

(表格非原创,数据来源于:Java注解

3.@Documented

作用:将此注解包含在 javadoc 中 ,它代表着此注解 会被javadoc工具提取成文档。 在doc文档中的内容会因为此注解的信息内容不同而不同。相当与@see,@param 等。
在这里插入图片描述

4.@Inherited

作用:此注解基于继承,@Inherited所修饰的父类其子类可以继承父类中的注解;
在这里插入图片描述
在这里插入图片描述

over~

  • 112
    点赞
  • 688
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
文件上传是Web开发中常见的功能之一,Java中也提供了多种方式来实现文件上传。其中,一种常用的方式是通过Apache的commons-fileupload组件来实现文件上传。 以下是实现文件上传的步骤: 1.在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> ``` 2.在前端页面中添加文件上传表单: ```html <form method="post" enctype="multipart/form-data" action="upload"> <input type="file" name="file"> <input type="submit" value="Upload"> </form> ``` 3.在后台Java代码中处理上传文件: ```java // 创建一个DiskFileItemFactory对象,用于解析上传的文件 DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置缓冲区大小,如果上传的文件大于缓冲区大小,则先将文件保存到临时文件中,再进行处理 factory.setSizeThreshold(1024 * 1024); // 创建一个ServletFileUpload对象,用于解析上传的文件 ServletFileUpload upload = new ServletFileUpload(factory); // 设置上传文件的大小限制,这里设置为10MB upload.setFileSizeMax(10 * 1024 * 1024); // 解析上传的文件,得到一个FileItem的List集合 List<FileItem> items = upload.parseRequest(request); // 遍历FileItem的List集合,处理上传的文件 for (FileItem item : items) { // 判断当前FileItem是否为上传的文件 if (!item.isFormField()) { // 获取上传文件的文件名 String fileName = item.getName(); // 创建一个File对象,用于保存上传的文件 File file = new File("D:/uploads/" + fileName); // 将上传的文件保存到指定的目录中 item.write(file); } } ``` 以上代码中,首先创建了一个DiskFileItemFactory对象,用于解析上传的文件。然后设置了缓冲区大小和上传文件的大小限制。接着创建一个ServletFileUpload对象,用于解析上传的文件。最后遍历FileItem的List集合,判断当前FileItem是否为上传的文件,如果是,则获取文件名,创建一个File对象,将上传的文件保存到指定的目录中。 4.文件上传完成后,可以给用户一个提示信息,例如: ```java response.getWriter().write("File uploaded successfully!"); ``` 以上就是使用Apache的commons-fileupload组件实现文件上传的步骤。需要注意的是,文件上传可能会带来安全隐患,因此在处理上传的文件时,需要进行严格的校验和过滤。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值