JavaSE-15笔记【注解(+2024新)】

文章目录

  • 1.注解概述
  • 2.几个常用的JDK内置的注解
    • 2.1 @Deprecated
    • 2.2 @Override
    • 2.3 @SuppressWarnings
    • 2.4 @FunctionalInterface
  • 3.自定义注解
    • 3.1 注解也可以定义属性
    • 3.2 注解的使用规则补充
  • 4.元注解
    • 4.1 @Retention
    • 4.2 @Target
    • 4.3 @Documented
    • 4.4 @Inherited
    • 4.5 @Repeatable
  • 5.通过反射获取注解
  • 6.一个小练习

1.注解概述

  • 什么是注解?
    ①注解是JDK1.5才引入的。
    ②注解可以标注在 类上,属性上,方法上 等。
    ③注解可以做到在不改变代码逻辑的前提下在代码中嵌入补充信息。

  • 注解与注释
    注释:给程序员看的,编译器编译时会忽略注释。
    注解:给编译器看的,或给其它程序看的,程序根据有没有这个注解来决定不同的处理方式。

  • 注解的重要性
    框架实现原理:框架 = 反射 + 注解 + 设计模式。

2.几个常用的JDK内置的注解

2.1 @Deprecated

@Deprecated用来标记过时的元素(比如类、方法、属性),在编译阶段遇到这个注解时会发出提醒警告,告诉开发者正在调用一个过时的元素比如过时的类、过时的方法、过时的属性等。

package annotationtest;public class AnnotationTest01 {public static void main(String[] args) {MyClass01 myClass01 = new MyClass01();String m = myClass01.m;myClass01.doSome();}
}@Deprecated
class MyClass01{@Deprecatedpublic String m;@Deprecatedpublic void doSome(){}
}

在IDEA中会有删除线及对应警告:
在这里插入图片描述

2.2 @Override

@Override只能修饰实例方法,被标注的方法必须是个重写方法,否则就会编译失败。

如下代码,尝试重写equals方法,但是传入的是String类型的参数,且标注在其他位置上也编译报错:

package annotationtest;public class AnnotationTest02 {@Overridepublic static int num = 100;@Override
//    public boolean equals(Object obj) {public boolean equals(String obj) {return super.equals(obj);}@Overridepublic void m(){}
}

编译报错:
在这里插入图片描述

2.3 @SuppressWarnings

@SuppressWarnings(抑制警告的注解):在实际开发中,建议尽量不要忽略警告,而是真正的去解决警告。

该注解常见的属性值(并非所有):
① @SuppressWarnings(“rawtypes”):抑制未使用泛型的警告;
② @SuppressWarnings(“resource”):抑制未关闭资源的警告;
③ @SuppressWarnings(“deprecation”):抑制使用了已过时资源时的警告;
④ @SuppressWarnings(“all”):抑制所有警告。

package annotationtest;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;@SuppressWarnings("all")
public class AnnotationTest03 {public static void main(String[] args) throws Exception {@SuppressWarnings("rawtypes")List list = new ArrayList();@SuppressWarnings("resource")FileInputStream fileInputStream = new FileInputStream("D:\\1.txt");@SuppressWarnings("deprecation")MyClass01 myClass01 = new MyClass01();}
}

2.4 @FunctionalInterface

@FunctionalInterface“函数式接口”的注解,这个是 JDK1.8 版本引入的新特性。若一个接口使用@FunctionalInterface标注,则该接口就有且只能存在一个抽象方法,否则就会发生编译错误。(注意:接口中的默认方法或静态方法可以有多个。)

package annotationtest;public class AnnotationTest04 {public static void main(String[] args) {}
}@FunctionalInterface
interface Flyable{void fly();void run();
}

多于一个抽象方法则编译失败:
在这里插入图片描述
可以有其他默认方法和静态方法:
在这里插入图片描述

3.自定义注解

  • 使用 @interface来定义注解。
  • 默认情况下注解可以出现在类上、方法上、属性上、构造方法上、方法参数上等…
  • 所有自定义的注解,它的父类是:java.lang.annotation.Annotation

自定义注解:

package annotationtest;public @interface MyAnnotation {
}

测试代码:

package annotationtest;@MyAnnotation
public class AnnotationTest05 {@MyAnnotationprivate String name;@MyAnnotationpublic void doSome(){}public void toDO(@MyAnnotation String name, @MyAnnotation String password){}
}

3.1 注解也可以定义属性

  • 注解也可以定义属性,不过属性定义时,属性名后面必须加一个小括号。
    属性的类型只能是:
    byte,short,int,long,float,double,boolean,char、String、Class、枚举类型、注解类型,以及以上所有类型的一维数组形式。
  • 注解在使用时必须给属性赋值,除非你使用了default关键字为属性指定了默认值。

给注解加上属性:

package annotationtest;public @interface MyAnnotation01 {byte b() default 1;short s();int i();long l();float f();double d();boolean flag() default true;char c();String name();Class clazz();Season season() default Season.AUTUMN;MyAnnotation annotation() default  @MyAnnotation;String[] words();
}

测试代码:

package annotationtest;@MyAnnotation01(s=2,i=10,l=10l, f=20.1f,d=22.2,c=1, name="zhangsan",clazz=Integer.class,words={"day","month","year"})
public class AnnotationTest06 {@MyAnnotation01(s=2,i=10,l=10l, f=20.1f,d=22.2,c=1, name="zhangsan",clazz=Integer.class,words={"day","month","year"})private int m;
}

3.2 注解的使用规则补充

  • 如果属性只有一个,并且属性名是value时,使用注解时value可以省略不写。
  • 如果属性是一个数组,且名为value,使用注解时,数组值只有一个,数组的大括号是可以省略的。

定义注解Table,其中只有一个属性,且属性名为value:

package annotationtest;public @interface Table {String value();
}

定义注解Parameter ,其中只有一个Strings数组属性,且名为value:

package annotationtest;public @interface Parameter {String[] value();
}

测试代码:

package annotationtest;@Table("t_user")
@Parameter("java")
public class AnnotationTest07 {}

4.元注解

用来标注注解的注解叫做元注解。(也是JDK内置的注解。)

常用的元注解:

  • @Retention:设置注解的保持性
  • @Target:设置注解可以出现的位置
  • @Documented:设置注解是否可以生成到帮助文档中
  • @Inherited:设置注解是否支持继承
  • @Repeatable:设置注解在某一个元素上是否可以重复使用(Java8的新特性。)

4.1 @Retention

Retention英文意思有保留、保持的意思,它表示注解存在阶段是保留在源代码(编译期),字节码(类加载)或者运行时(JVM中运行)。
在@Retention注解中使用枚举属性RetentionPolicy来表示注解保留时期:

  • @Retention(RetentionPolicy.SOURCE):注解仅存在于源代码中,在字节码文件中不包含。
  • @Retention(RetentionPolicy.CLASS):注解在字节码文件中存在,但运行时无法获得(默认)。
  • @Retention(RetentionPolicy.RUNTIME):注解在字节码文件中存在,且运行时可通过反射获取。
package annotationtest.meta.meta01;import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.CLASS)
public @interface MyAnnotation {
}

测试代码:

package annotationtest.meta.meta01;import java.lang.annotation.Annotation;@MyAnnotation
public class Test {public static void main(String[] args) throws Exception{//获取类Class clazz = Class.forName("annotationtest.meta.meta01.Test");//获取类上的注解Annotation annotation = clazz.getAnnotation(MyAnnotation.class);System.out.println(annotation);}
}

运行结果:
在这里插入图片描述
修改@Retention注解:

package annotationtest.meta.meta01;import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}

再次测试结果:
在这里插入图片描述

4.2 @Target

用于描述注解可以使用的位置,该注解使用ElementType枚举类型用于描述注解可以出现的位置,
ElementType有如下枚举值:

  • @Target(ElementType.TYPE):作用于接口、类、枚举、注解。
  • @Target(ElementType.FIELD):作用于属性、枚举的常量。
  • @Target(ElementType.METHOD):作用于方法。
  • @Target(ElementType.PARAMETER):作用于方法参数。
  • @Target(ElementType.CONSTRUCTOR):作用于构造方法。
  • @Target(ElementType.LOCAL_VARIABLE):作用于局部变量。
  • @Target(ElementType.ANNOTATION_TYPE):作用于注解。
  • @Target(ElementType.PACKAGE):作用于包。
  • @Target(ElementType.TYPE_PARAMETER):作用于泛型,即泛型方法、泛型类和泛型接口。
  • @Target(ElementType.TYPE_USE):作用于任意类型。

定义只能用于方法上的注解:

package annotationtest.meta.meta02;import java.lang.annotation.ElementType;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
public @interface MyAnnotation {
}

测试(使用在类上时编译失败):
在这里插入图片描述

4.3 @Documented

Documented的英文意思是文档。使用javadoc.exe工具可以从程序源代码中抽取类、方法、属性等注释形成一个源代码配套的API帮助文档,而该工具抽取时默认不包括注解内容。如果使用的注解被@Documented标注,那么该注解就能被javadoc.exe工具提取到API文档。

4.4 @Inherited

Inherited的英文意思是继承,但是这个继承和我们平时理解的继承大同小异,一个被@Inherited注解了的注解修饰了一个父类,则它的子类也继承了父类的注解。

定义可继承注解:

package annotationtest.meta.meta03;import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME) //这个例子中为了测试时能够获取Cat上的注解,所以需要设置保持性
@Inherited
public @interface MyAnnotation {
}

Animal 类上加注解:

package annotationtest.meta.meta03;@MyAnnotation
public class Animal {
}

Cat类继承Animal类:

package annotationtest.meta.meta03;public class Cat extends Animal {
}

测试代码:

package annotationtest.meta.meta03;public class Test {public static void main(String[] args) {Class<Cat> catClass = Cat.class;MyAnnotation annotation = catClass.getAnnotation(MyAnnotation.class);System.out.println(annotation);}
}

运行结果:
在这里插入图片描述

4.5 @Repeatable

Repeatable表示可重复的含义,该注解属于JDK1.8版本的新特性,表示可以可以重复使用该注解。

定义可重复注解:

package annotationtest.meta.meta04;import java.lang.annotation.Repeatable;@Repeatable(Authors.class) //必须加上一个参数,这个参数也是一个注解,是一个以注解Author数组为属性的注解
public @interface Author {String name();
}

辅助注解:

package annotationtest.meta.meta04;public @interface Authors {Author[] value(); //这里属性名必须为value}

测试:
在这里插入图片描述

5.通过反射获取注解

1)获取类上的所有注解:Annotation[] annotations = clazz.getAnnotations();
2)获取类上指定的某个注解:
clazz.isAnnotationPresent(AnnotationTest01.class)
AnnotationTest01 an = clazz.getAnnotation(AnnotationTest01.class);
3)获取属性上的所有注解:Annotation[] annotations = field.getAnnotations();
4)获取属性上指定的某个注解:
field.isAnnotationPresent(AnnotationTest02.class)
AnnotationTest02 an = field.getAnnotation(AnnotationTest02.class);
5) 获取方法上的所有注解:Annotation[] annotations = method.getAnnotations();
6)获取方法上指定的某个注解:
method.isAnnotationPresent(AnnotationTest02.class)
AnnotationTest02 an = method.getAnnotation(AnnotationTest02.class);

Annotation1注解:

package annotationtest.reflectannotation;import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Target({ElementType.TYPE,ElementType.FIELD})
public @interface Annotation1 {String name();int age();}

Annotation2注解:

package annotationtest.reflectannotation;import java.lang.annotation.*;@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Annotation2 {String email();
}

测试代码:

package annotationtest.reflectannotation;import SuperTest.superTest03.A;import java.lang.annotation.Annotation;
import java.lang.reflect.Field;@Annotation1(name = "zhangsan",age = 23)
@Annotation2(email = "wewerwerer23@126.com")
public class ReflectAnnotationTest {@Annotation1(name = "lisi", age = 29)public int sum;public static void main(String[] args) throws Exception {//获取类Class<ReflectAnnotationTest> aClass = ReflectAnnotationTest.class;System.out.println("获取本类上所有注解:");//获取类上所有注解Annotation[] annotations = aClass.getAnnotations();//遍历for (Annotation annotation: annotations) {System.out.println(annotation);}System.out.println("\n获取类上的Annotation1注解:");//判断类上是否有某个注解if(aClass.isAnnotationPresent(Annotation1.class)){//获取对应注解及属性Annotation1 annotation = aClass.getAnnotation(Annotation1.class);System.out.println(annotation);System.out.println(annotation.age());System.out.println(annotation.name());}//获取属性上的注解//1.先获取属性Field field = aClass.getDeclaredField("sum");System.out.println("\n获取属性"+ field.getName() +"上的Annotation1注解:");//2.判断该属性上是否有某个注解if(field.isAnnotationPresent(Annotation1.class)){//3.获取属性上的注解及其属性Annotation1 annotation1 = field.getAnnotation(Annotation1.class);System.out.println(annotation1);System.out.println(annotation1.name());System.out.println(annotation1.age());}}
}

运行结果:
在这里插入图片描述

6.一个小练习

  1. 储备知识:
    数据库是用来组织数据的,数据库使用表来组织数据。
    一张表应该有表名,例如:t_user
    一张表中应该有很多字段,每个字段有字段名和数据类型,例如age字段是int类型。
    数据库中整数对应的类型是:int。字符串对应的类型是:varchar。
    建表语句如下:
    在这里插入图片描述

编写程序扫描一个包下所有的类,凡是被 @Table 注解标注的类都要生成一条建表语句,表名在 @Table 注解中指定。被@Table 标注的类中的属性被 @Column 注解标注,在 @Column 注解中描述字段的名称和字段的数据类型。

Table注解:

package finaltest.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 凡是被@Table注解标注的类需要生成建表语句*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Table {/*** 用来指定表名* @return 表名*/String value();
}

Column注解:

package finaltest.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 该注解用于标注一个类中的属性,被标注的属性参与建表*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Column {/*** 字段的名字* @return 字段的名字*/String name() default "";/*** 字段的数据类型* @return 字段的数据类型*/String type() default "varchar";
}

User类:

package finaltest.a;import finaltest.annotation.Column;
import finaltest.annotation.Table;@Table("t_user")
public class User {@Column(name = "cid")private String uid;@Column(name = "uname")private String uname;@Column(name = "password")private String password;@Column(name = "age", type = "int")private int age;private String eamil;
}

Customer类:

package finaltest.c;import finaltest.annotation.Column;
import finaltest.annotation.Table;@Table("t_customer")
public class Customer {@Column(name = "cid")private String cid;@Column(name = "name")private String name;@Column(name = "age", type = "int")private int  age;private String address;
}

Vip类:

package finaltest.a.b;import finaltest.annotation.Column;
import finaltest.annotation.Table;@Table("t_vip")
public class Vip {@Column(name="vid")private String vid;@Column(name="name")private String name;@Column(name="grade")private String grade;
}

测试类:

package finaltest;import finaltest.annotation.Column;
import finaltest.annotation.Table;import java.io.File;
import java.lang.reflect.Field;public class Test {private static String rootPath;private static StringBuilder sb = new StringBuilder(); //定义成全局变量更合理public static void main(String[] args) {//获取当前类路径的根路径rootPath = Thread.currentThread().getContextClassLoader().getResource(".").getPath();File file = new File(rootPath);try {generateCreateStatement(file);} catch (Exception e) {e.printStackTrace();}}private static void generateCreateStatement(File file) throws Exception {if(file.isFile()){ //file是一个文件的时候递归结束String classFileAbsolutePath = file.getAbsolutePath();//只针对字节码文件操作if(classFileAbsolutePath.endsWith(".class")){String className = classFileAbsolutePath.substring(rootPath.length()-1, classFileAbsolutePath.length() - ".class".length()).replace("\\",".");Class clazz = Class.forName(className);//判断类上是否有Table注解if (clazz.isAnnotationPresent(Table.class)){Table tableAnnotation = (Table) clazz.getAnnotation(Table.class);//获取表名String tableName = tableAnnotation.value();sb.append("create table ");sb.append(tableName);sb.append("(\n");//获取所有声明的属性Field[] fields = clazz.getDeclaredFields();//遍历for (Field field: fields) {//判断属性上是否有Column属性if(field.isAnnotationPresent(Column.class)){Column columnAnnotation = field.getAnnotation(Column.class);//属性名String fieldName = columnAnnotation.name();//属性类型String fieldType = columnAnnotation.type();sb.append("\t");sb.append(fieldName);sb.append(" ");sb.append(fieldType);sb.append(",\n");}}//删除当前拼接的最后一个逗号sb.deleteCharAt(sb.length()-2);sb.append(");\n");}}System.out.println(sb);return;}//获取当前目录下所有文件File[] files = file.listFiles();for (File f : files){//递归generateCreateStatement(f);}}
}

运行结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/1676.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序开发

微信小程序隶属于前端&#xff0c;因此我们只需要了解掌握一些基本的功能与业务逻辑即可。 HttpClient HttpClient 是Apache Jakarta Common 下的子项目&#xff0c;可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议…

Robbins-Monro(RM)算法【随机近似】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实践—GridWorld 第…

WP-AutoPostPro 汉化版: WordPress自动采集发布插件

WP-AutoPostPro 是目前最好用的WordPress自动采集发布插件&#xff0c;最大的特点是可以采集来自于任何网站的内容并自动发布到你的WordPress站点。真正做到可以采集任何网站的内容并自动发布&#xff0c;采集过程完全自动进行无需人工干预&#xff0c;并提供内容过滤、HTML标签…

libssh C++封装(一)

1 概述 libssh是一个在客户端和服务器端实现SSHv2协议的多平台C库。使用libssh&#xff0c;您可以远程执行程序、传输文件、使用安全透明的隧道、管理公钥等等。本文描述的对libssh客户端功能的C封装。 libssh下载地址 2 设计 2.1 类图 类型说明&#xff1a; Session SSH连接…

Centos7 的 Open Stack T 版搭建流程 --- (三)配置消息队列

配置消息队列 文章目录 配置消息队列&#xff08;1&#xff09;安装 RabbitMQ 服务并配置新用户权限controller &#xff08;2&#xff09;如何开启图形化&#xff08;拓展&#xff09; &#xff08;1&#xff09;安装 RabbitMQ 服务并配置新用户权限 controller yum install…

开源AI智能名片源码:虚实融合引领品牌营销新篇章

随着数字时代的飞速发展&#xff0c;品牌营销已经步入了一个全新的纪元。在这个变革的时代&#xff0c;开源AI智能名片源码以其独特的虚实融合功能&#xff0c;正引领着品牌营销走向更加智能化、个性化的道路。 传统的品牌营销往往局限于单向的信息传播&#xff0c;难以与用户产…

成都污水处理站运维厂家服务商

选择污水处理运维服务厂家时&#xff0c;需要考虑以下几个关键的事项来确保您选择了合适的服务提供商&#xff1a; 1. **资质和认证&#xff1a;** 确认厂家是否具备国家或地方政府颁发的相关环保和水处理行业资质、证书&#xff0c;比如ISO认证、水污染治理资质等&#xff0c;…

Nacos服务注册中心的下载与使用

1. Nacos是什么&#xff1f; https://nacos.io/ 官方&#xff1a;一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。 集 注册中心配置中心服务管理 平台 Nacos 的关键特性包括: 服务发现和服务健康监测 动态配置服务 动…

手写一个Spring IOC框架

目录 一&#xff0c;Spring IOC 二&#xff0c;流程图设计 三&#xff0c;设计思路解析 三&#xff0c;开始写代码 1.准备工作: 2.扫描并加载类信息 3.初始化bean 4.测试一下 一&#xff0c;Spring IOC Spring IoC容器是Spring框架的核心&#xff0c;它通过读取配置信息…

【每日刷题】Day20

【每日刷题】Day20 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 面试题 17.04. 消失的数字 - 力扣&#xff08;LeetCode&#xff09; 2. 189. 轮转数组 - 力扣&#…

随机森林(Random Forests)

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个随机森林&#xff08;Random Forests&#xff09;模型程序,最后打印5个条件分别的影响力。 ChatGPT 下面是一个使…

后端获取请求体Body,将请求体进行解密放回Request请求,并能通过@RequestBody获取

目前系统发送的post和put请求都是没有加密数据。客户需要将请求体加密。而系统已经基本开发完成&#xff0c;不可能一个一个去修改发送的请求。就需要在发送请求时候在拦截器中将body进行加密。并且在后端进行请求过滤解密&#xff0c;并且能通过RequestBody继续获取对象。 1.…

matlab学习004-使用matlab绘制两个序列及信号的卷积波形图

目录 1&#xff0c;序列&#xff1a;x(n)u(n-2)-u(n-10)&#xff0c;h(n)((0.9)^n)*u(n) 1&#xff09;前期基础 ①conv函数 ②离散单位阶跃信号 2&#xff09;波形图 3&#xff09;代码 ①使用input方法 ②代码改进【推荐使用】 2&#xff0c;信号&#xff1a;xu(…

C语言趣味代码(二)

1.珠玑妙算 1.1 介绍 《珠玑妙算》(Mastermind)是英国Invicta公司于1973年开始销售的一款益智游戏&#xff0c;据说迄今为止已经在全世界销售了5000万套。《珠玑妙算》于1974年获奖后&#xff0c;在1975年传入美国&#xff0c;1976年leslieH.Autl博士甚至还出版了一本名为The…

去雾笔记01-SRKTDN: Applying Super Resolution Method to Dehazing Task

文章目录 Abstract1. Introduction2. Related Work3. Method3.1. Network Architecture Abstract 们提出了一种结合超分辨方法和知识转移方法的模型。我们的模型由一个教师网络、一个去雾网络和一个超分辨率网络组成。 1. Introduction ECNU KT团队提出了一个知识蒸馏[20]模…

智慧养老平台|基于SprinBoot+vue的智慧养老平台系统(源码+数据库+文档)

智慧养老平台目录 基于SprinBootvue的外贸平台系统 一、前言 二、系统设计 三、系统功能设计 前台 后台 管理员功能 老人功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农…

控制台程序设置

该篇博客主要是对下一篇博客《贪吃蛇游戏》的设计做铺垫&#xff0c;大家可以持续关注(点个关注哦&#x1f60a;)等待更新&#xff0c;以下是个人主页&#xff1a; 敲上瘾-CSDN博客 在我们写的程序运行起来后弹出的框就是控制台程序。而这个窗口我们是可以对它进行设置的&…

终于找到恢复照片的绝佳方法了!手机照片恢复的看这里!

当今手机已经彻底离不开我们的生活&#xff0c;手机里面的数据也成为了我们高质量生活的重要构成&#xff0c;当手机内存爆满&#xff0c;我们就不得不采用清除部分手机数据的方法来释放空间。有一些数据删除后往往才发现还另有用处&#xff0c;比如手机里存储着的大量照片。 …

帆软报表实现通过js查询数据库设置表格数据

最近做的一直在做报表相关的需求&#xff0c;自己也是一边学一边做。有一个有意思的需求是在表格中某个单元格在编辑完以后其它的表格中的数据自动填充&#xff0c;当也是根据一定的规则与数据来源才能填充的。 先来点基础概念&#xff0c;就是帆软给我们提供了这个编辑后的事件…

学习笔记:Vue2高级篇

Vue2 学习笔记&#xff1a;Vue2基础篇_ljtxy.love的博客-CSDN博客学习笔记&#xff1a;Vue2中级篇_ljtxy.love的博客-CSDN博客学习笔记&#xff1a;Vue2高级篇_ljtxy.love的博客-CSDN博客 Vue3 学习笔记&#xff1a;Vue3_ljtxy.love的博客&#xff09;-CSDN博客 文章目录 7.…