当前位置: 首页 > news >正文

【面试】Java 反射机制(常见面试题)

文章目录

  • 前言
  • 一、反射是什么?
  • 二、为什么要有反射
  • 三、反射 API
    • 3.1 获取 Class 对象的三种方式
    • 3.2 获取成员变量
    • 3.3 获取构造方法
    • 3.4.获取非构造方法
  • 四、实践
  • 五、常见面试题
    • 5.1. 什么是反射?
    • 5.2. 哪里用到反射机制?
    • 5.3. 什么叫对象序列化,什么是反序列化,实现对象序列化需要做哪些工作?
    • 5.4. 反射机制的优缺点?
    • 5.5. 动态代理是什么?有哪些应用?
    • 5.6. 怎么实现动态代理?
    • 5.7. Java反射机制的作用
    • 5.8. 如何使用Java的反射?

前言

反射(Reflection) 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性和方法。

反射是一项高级开发人员应该掌握的“黑科技”,其实反射并不是 Java 独有的,许多编程语言都提供了反射功能。在面试中面试官也经常对反射问题进行考察,反射是所有注解实现的原理,尤其在框架设计中,有不可替代的作用。关于反射,常见的面试考察点包括:

  • 如何反射获取 Class 对象
  • 如何反射获取类中的所有字段
  • 如何反射获取类中的所有构造方法
  • 如何反射获取类中的所有非构造方法

本篇我们就一起来学习一下 Java 反射机制。

一、反射是什么?

反射的概念是由 Smith 在 1982 年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。通俗地讲,一提到反射,我们就可以想到镜子。镜子可以明明白白地照出我是谁,还可以照出别人是谁。反映到程序中,反射就是用来让开发者知道这个类中有什么成员,以及别的类中有什么成员。

二、为什么要有反射

有的同学可能会疑惑,Java 已经有了封装为什么还要有反射呢?反射看起来像是破坏了封装性。甚至让私有变量都可以被外部访问到,使得类变得不那么安全了。我们来看一下 Oracle 官方文档中对反射的描述:

Uses of Reflection
Reflection is commonly used by programs which require the ability to examine or modify the runtime behavior of applications running in the Java virtual machine. This is a relatively advanced feature and should be used only by developers who have a strong grasp of the fundamentals of the language. With that caveat in mind, reflection is a powerful technique and can enable applications to perform operations which would otherwise be impossible.
Extensibility FeaturesAn application may make use of external, user-defined classes by creating instances of extensibility objects using their fully-qualified names.
Class Browsers and Visual Development EnvironmentsA class browser needs to be able to enumerate the members of classes. Visual development environments can benefit from making use of type information available in reflection to aid the developer in writing correct code.
Debuggers and Test ToolsDebuggers need to be able to examine private members on classes. Test harnesses can make use of reflection to systematically call a discoverable set APIs defined on a class, to insure a high level of code coverage in a test suite.

从 Oracle 官方文档中可以看出,反射主要应用在以下几方面:

  • 反射让开发人员可以通过外部类的全路径名创建对象,并使用这些类,实现一些扩展的功能。
  • 反射让开发人员可以枚举出类的全部成员,包括构造函数、属性、方法。以帮助开发者写出正确的代码。
  • 测试时可以利用反射 API 访问类的私有成员,以保证测试代码覆盖率。

也就是说,Oracle 希望开发者将反射作为一个工具,用来帮助程序员实现本不可能实现的功能(perform operations which would otherwise be impossible)。正如《人月神话》一书中所言:软件工程没有银弹。很多程序架构,尤其是三方框架,无法保证自己的封装是完美的。如果没有反射,对于外部类的私有成员,我们将一筹莫展,所以我们有了反射这一后门,为程序设计提供了更大的灵活性。工具本身并没有错,关键在于如何正确地使用。

三、反射 API

Java 类的成员包括以下三类:属性字段、构造函数、方法。反射的 API 也是与这几个成员相关:

在这里插入图片描述

  • Field 类:提供有关类的属性信息,以及对它的动态访问权限。它是一个封装反射类的属性的类。
  • Constructor 类:提供有关类的构造方法的信息,以及对它的动态访问权限。它是一个封装反射类的构造方法的类。
  • Method 类:提供关于类的方法的信息,包括抽象方法。它是用来封装反射类方法的一个类。
  • Class 类:表示正在运行的 Java 应用程序中的类的实例。
  • Object 类:Object 是所有 Java 类的父类。所有对象都默认实现了 Object 类的方法。

接下来,我们通过一个典型的例子来学习反射。先做准备工作,新建 com.test.reflection 包,在此包中新建一个 Student 类:

package com.test.reflection;public class Student {private String studentName;public int studentAge;public Student() {}private Student(String studentName) {this.studentName = studentName;}public void setStudentAge(int studentAge) {this.studentAge = studentAge;}private String show(String message) {System.out.println("show: " + studentName + "," + studentAge + "," + message);return "testReturnValue";}
}

可以看到,Student 类中有两个字段、两个构造方法、两个函数,且都是一个私有,一个公有。由此可知,这个测试类基本涵盖了我们平时常用的所有类成员。

3.1 获取 Class 对象的三种方式

获取 Class 对象有三种方式:

//1. 通过字符串获取Class对象,这个字符串必须带上完整路径名Class studentClass = Class.forName("com.test.reflection.Student");//2. 通过类的class属性
Class studentClass2 = Student.class;//3. 通过对象的getClass()函数
Student studentObject = new Student();
Class studentClass3 = studentObject.getClass();
  • 第一种方法是通过类的全路径字符串获取 Class 对象,这也是我们平时最常用的反射获取 Class 对象的方法;
  • 第二种方法有限制条件:需要导入类的包;
  • 第三种方法已经有了 Student 对象,不再需要反射。

通过这三种方式获取到的 Class 对象是同一个,也就是说 Java 运行时,每一个类只会生成一个 Class 对象。

我们将其打印出来测试一下:

System.out.println("class1 = " + studentClass + "\n" +"class2 = " + studentClass2 + "\n" +"class3 = " + studentClass3 + "\n" +"class1 == class2 ? " + (studentClass == studentClass2) + "\n" +"class2 == class3 ? " + (studentClass2 == studentClass3));

运行程序,输出如下:

class1 = class com.test.reflection.Student
class2 = class com.test.reflection.Student
class3 = class com.test.reflection.Student
class1 == class2 ? true
class2 == class3 ? true

OK,拿到 Class 对象之后,我们就可以为所欲为啦!

3.2 获取成员变量

获取字段有两个 API:getDeclaredFields和getFields。他们的区别是:getDeclaredFields用于获取所有声明的字段,包括公有字段和私有字段,getFields仅用来获取公有字段:

//1. 获取所有声明的字段Field[] declaredFieldList = studentClass.getDeclaredFields();
for (Field declaredField : declaredFieldList) {System.out.println("declared Field: " + declaredField);
}//2. 获取所有公有的字段
Field[] fieldList = studentClass.getFields();
for (Field field : fieldList) {System.out.println("field: " + field);
}

运行程序,输出如下:

declared Field: private java.lang.String com.test.reflection.Student.studentName
declared Field: public int com.test.reflection.Student.studentAge
field: public int com.test.reflection.Student.studentAge

3.3 获取构造方法

获取构造方法同样包含了两个 API:用于获取所有构造方法的 getDeclaredConstructors和用于获取公有

构造方法的getConstructors:// 1.获取所有声明的构造方法
Constructor[] declaredConstructorList = studentClass.getDeclaredConstructors();
for (Constructor declaredConstructor : declaredConstructorList) {System.out.println("declared Constructor: " + declaredConstructor);
}
// 2.获取所有公有的构造方法
Constructor[] constructorList = studentClass.getConstructors();
for (Constructor constructor : constructorList) {System.out.println("constructor: " + constructor);
}

运行程序,输出如下:

declared Constructor: public com.test.reflection.Student()
declared Constructor: private com.test.reflection.Student(java.lang.String)
constructor: public com.test.reflection.Student()

3.4.获取非构造方法

同样地,获取非构造方法的两个 API 是:获取所有声明的非构造函数的 getDeclaredMethods 和仅获取公有非构造函数的 getMethods:

// 1.获取所有声明的函数
Method[] declaredMethodList = studentClass.getDeclaredMethods();
for (Method declaredMethod : declaredMethodList) {System.out.println("declared Method: " + declaredMethod);
}
// 2.获取所有公有的函数
Method[] methodList = studentClass.getMethods();
for (Method method : methodList) {System.out.println("method: " + method);
}

运行程序,输出如下:

declared Method: public void com.test.reflection.Student.setStudentAge(int)
declared Method: private java.lang.String com.test.reflection.Student.show(java.lang.String)
method: public void com.test.reflection.Student.setStudentAge(int)
method: public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
method: public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
method: public final void java.lang.Object.wait() throws java.lang.InterruptedException
method: public boolean java.lang.Object.equals(java.lang.Object)
method: public java.lang.String java.lang.Object.toString()
method: public native int java.lang.Object.hashCode()
method: public final native java.lang.Class java.lang.Object.getClass()
method: public final native void java.lang.Object.notify()
method: public final native void java.lang.Object.notifyAll()

从输出中我们看到,getMethods 方法不仅获取到了我们声明的公有方法setStudentAge,还获取到了很多 Object 类中的公有方法。这是因为我们前文已说到:Object 是所有 Java 类的父类。所有对象都默认实现了 Object 类的方法。 而getDeclaredMethods是无法获取到父类中的方法的。

四、实践

学以致用,让我们来一个实际的应用感受一下。还是以 Student 类为例,如果此类在其他的包中,并且我们的需求是要在程序中通过反射获取他的构造方法,构造出 Student 对象,并且通过反射访问他的私有字段和私有方法。那么我们可以这样做:

// 1.通过字符串获取Class对象,这个字符串必须带上完整路径名
Class studentClass = Class.forName("com.test.reflection.Student");
// 2.获取声明的构造方法,传入所需参数的类名,如果有多个参数,用','连接即可
Constructor studentConstructor = studentClass.getDeclaredConstructor(String.class);
// 如果是私有的构造方法,需要调用下面这一行代码使其可使用,公有的构造方法则不需要下面这一行代码
studentConstructor.setAccessible(true);
// 使用构造方法的newInstance方法创建对象,传入构造方法所需参数,如果有多个参数,用','连接即可
Object student = studentConstructor.newInstance("NameA");
// 3.获取声明的字段,传入字段名
Field studentAgeField = studentClass.getDeclaredField("studentAge");
// 如果是私有的字段,需要调用下面这一行代码使其可使用,公有的字段则不需要下面这一行代码
// studentAgeField.setAccessible(true);
// 使用字段的set方法设置字段值,传入此对象以及参数值
studentAgeField.set(student,10);
// 4.获取声明的函数,传入所需参数的类名,如果有多个参数,用','连接即可
Method studentShowMethod = studentClass.getDeclaredMethod("show",String.class);
// 如果是私有的函数,需要调用下面这一行代码使其可使用,公有的函数则不需要下面这一行代码
studentShowMethod.setAccessible(true);
// 使用函数的invoke方法调用此函数,传入此对象以及函数所需参数,如果有多个参数,用','连接即可。函数会返回一个Object对象,使用强制类型转换转成实际类型即可
Object result = studentShowMethod.invoke(student,"message");
System.out.println("result: " + result);

程序的逻辑注释已经写得很清晰了,我们再梳理一下:

  1. 先用第一种全路径获取 Class 的方法获取到了 Student 的 Class 对象
  2. 然后反射调用它的私有构造方法 private Student(String studentName),构建出 newInstance
  3. 再将其公有字段 studentAge 设置为 10
  4. 最后反射调用其私有方法 show,传入参数 “message”,并打印出这个方法的返回值。

其中,setAccessible 函数用于动态获取访问权限,Constructor、Field、Method 都提供了此方法,让我们得以访问类中的私有成员。

运行程序,输出如下:

show: NameA,10,message
result: testReturnValue

五、常见面试题

5.1. 什么是反射?

反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。

5.2. 哪里用到反射机制?

  • JDBC中,利用反射动态加载了数据库驱动程序。
  • Web服务器中利用反射调用了Sevlet的服务方法。
  • Eclispe等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法。
  • 很多框架都用到反射机制,注入属性,调用方法,如Spring。

5.3. 什么叫对象序列化,什么是反序列化,实现对象序列化需要做哪些工作?

  • 对象序列化,将对象中的数据编码为字节序列的过程。
  • 反序列化;将对象的编码字节重新反向解码为对象的过程。
  • JAVA提供了API实现了对象的序列化和反序列化的功能,使用这些API时需要遵守如下约定:
    • 被序列化的对象类型需要实现序列化接口,此接口是标志接口,没有声明任何的抽象方法,JAVA编译器识别这个接口,自动的为这个类添加序列化和反序列化方法。
    • 为了保持序列化过程的稳定,建议在类中添加序列化版本号。
    • 不想让字段放在硬盘上就加transient
  • 以下情况需要使用 Java 序列化:
    • 想把的内存中的对象状态保存到一个文件中或者数据库中时候;
    • 想用套接字在网络上传送对象的时候;
    • 想通过RMI(远程方法调用)传输对象的时候。

5.4. 反射机制的优缺点?

  • 优点:可以动态执行,在运行期间根据业务功能动态执行方法、访问属性,最大限度发挥了java的灵活性。
  • 缺点:对性能有影响,这类操作总是慢于直接执行java代码。

5.5. 动态代理是什么?有哪些应用?

  • 动态代理是运行时动态生成代理类。
  • 动态代理的应用有 Spring AOP数据查询、测试框架的后端 mock、rpc,Java注解对象获取等。

5.6. 怎么实现动态代理?

  • JDK 原生动态代理和 cglib 动态代理。
  • JDK 原生动态代理是基于接口实现的,而 cglib 是基于继承当前类的子类实现的。

5.7. Java反射机制的作用

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的方法

5.8. 如何使用Java的反射?

  • 通过一个全限类名创建一个对象
    • Class.forName(“全限类名”); 例如:com.mysql.jdbc.Driver Driver类已经被加载到 jvm中,并且完成了-类的初始化工作就行了
    • 类名.class; 获取Class<?> clz 对象
    • 对象.getClass();
  • 获取构造器对象,通过构造器new出一个对象
    • Clazz.getConstructor([String.class]);
    • Con.newInstance([参数]);
  • 通过class对象创建一个实例对象(就相当与new类名()无参构造器)
    • Cls.newInstance();
  • 通过class对象获得一个属性对象
    • Field c=cls.getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。
    • Field c=cls.getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的声明字段
  • 通过class对象获得一个方法对象
    • Cls.getMethod(“方法名”,class……parameaType);(只能获取公共的)
    • Cls.getDeclareMethod(“方法名”);(获取任意修饰的方法,不能执行私有)
    • M.setAccessible(true);(让私有的方法可以执行)
  • 让方法执行
    • . Method.invoke(obj实例对象,obj可变参数);-----(是有返回值的)

相关文章:

【面试】Java 反射机制(常见面试题)

文章目录 前言一、反射是什么&#xff1f;二、为什么要有反射三、反射 API3.1 获取 Class 对象的三种方式3.2 获取成员变量3.3 获取构造方法3.4.获取非构造方法 四、实践五、常见面试题5.1. 什么是反射&#xff1f;5.2. 哪里用到反射机制&#xff1f;5.3. 什么叫对象序列化&…...

JavaScript最佳实践

JavaScript最佳实践 2023.5.8版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 JavaScript 是一种动态编程语言&#xff0c;可让开发者创建动态和交互式 Web 应用程序。然而&#xff0c;编写 JavaScript 代码比较具有挑战性&#xff0c;尤其…...

景23转债,海能转债上市价格预测

景23转债 基本信息 转债名称&#xff1a;景23转债&#xff0c;评级&#xff1a;AA&#xff0c;发行规模&#xff1a;11.54亿元。 正股名称&#xff1a;景旺电子&#xff0c;今日收盘价&#xff1a;22.52元&#xff0c;转股价格&#xff1a;25.71元。 当前转股价值 转债面值 / …...

TDengine 部署与使用----时序数据库

官网 通过 Docker 快速体验 TDengine | TDengine 文档 | 涛思数据 docker安装 拉取最新docker镜像 docker pull tdengine/tdengine:latest 然后执行 docker run -d -p 6030:6030 -p 6041:6041 -p 6043-6049:6043-6049 -p 6043-6049:6043-6049/udp tdengine/tdengine 查看容器…...

ShardingSphere系列四(Sharding-JDBC内核原理及核心源码解析)

文章目录 1. ShardingSphere内核解析1.1 解析引擎1.2 路由引擎1.3 改写引擎1.4 执行引擎1.5 归并引擎 2. ShardingSphere的SPI扩展点2.1 SPI机制2.2 ShardingSphere中的SPI扩展点2.3 实现自定义主键生成策略 3. ShardingSphere源码 1. ShardingSphere内核解析 ShardingSphere虽…...

【2023】华为OD机试真题全语言-题目0234-字符串重新排列

题目0234-字符串重新排列 题目描述 给定一个字符串s,s包括以空格分隔的若干个单词,请对s进行如下处理后输出: 单词内部调整:对每个单词字母重新按字典序排序单词间顺序调整: 统计每个单词出现的次数,并按次数降序排列次数相同,按单词长度升序排列次数和单词长度均相同…...

Springboot +Flowable,三种常见网关的使用(排他、并行、包容网关)(一)

一.简介 Flowable 中常用的网关主要有三种类型&#xff0c;分别是&#xff1a; 排他网关并行网关包容网关 下面来说下这三种的网关的概念和用法。 二.排他网关 排他网关&#xff0c;也叫互斥网关&#xff0c;截图如下&#xff1a; 排他网关有一个入口&#xff0c;多个有效…...

软考高项(一)信息化发展 ★重点集萃★

1、信息是确定性的增加。信息不是物质&#xff0c;也不是能力。 2、信息的特征与质量&#xff0c;主要包括&#xff1a;客观性、普遍性、无限性、动态性、相对性、依附性、变换性、传递性、层次性、系统性和转化性等。 3、信息的质量属性&#xff0c;主要包括&#xff1a;精确…...

大项目准备(2)

目录 中国十大最具发展潜力城市 docker是什么&#xff1f;能介绍一下吗&#xff1f; 中国十大最具发展潜力城市 按照人随产业走、产业决定城市兴衰、规模经济和交通成本等区位因素决定产业布局的基本逻辑&#xff0c;我们在《中国城市发展潜力排名&#xff1a;2022》研究报告…...

计算机网络【2】 子网掩码

学习大佬记下的笔记 https://zhuanlan.zhihu.com/p/163119376 "子网"掩码&#xff0c;顾名思义&#xff0c;它就是拿来划分子网的&#xff0c;更准确的说&#xff0c;划分子网的同时&#xff0c;还能通过它知道主机在子网里面的具体ip的具体地址。 子网掩码只有一个…...

linux发行家族和发行版及安装软件方式

在Linux平台下&#xff0c;软件包的类型可以划分为两类&#xff1a;源码包、二进制包&#xff1b; 一个软件要在Linux上执行&#xff0c;必须是二进制文件&#xff1b; 源码包&#xff1a;即程序软件的源代码&#xff08;一般也叫Tarball&#xff0c;即将软件的源码以tar打包后…...

FE_Vue学习笔记 条件渲染[v-show v-if] 列表渲染[v-for] 列表过滤 列表排序

1 条件渲染 v-show v-if 使用template可以使其里面的内容在html的结构中不变。条件渲染&#xff1a; v-if 1&#xff09;v-if“表达式” 2&#xff09;v-else-if“表达式” 3&#xff09;v-else {} 适用于&#xff1a;切换频率较低的场景。特点&#xff1a;不展示的DOM元素直…...

基于C++实现旅行线路设计

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 系统根据风险评估&#xff0c;为旅客设计一条符合旅行策略的旅行线路并输出&#xff0c;系统能查询当前时刻旅客所处的地点和状态&#xff08;停留城市/所在交通工具&#xff09;。 实验内容和实验环境描述 1.1 实验内容 城…...

Lenovo m93 mini 电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板Lenovo m93 mini 处理器Intel i5-4590T 2.20GHz (35w) 4-core/4-thread已驱动 内存8GB (2x4) DDR3 1600MHz已驱动 硬盘2.5" SSD Samsung 8…...

【论文阅读】COPA:验证针对中毒攻击的离线强化学习的稳健策略

COPA: Certifying Robust Policies for Offline Reinforcement Learning against Poisoning Attacks 作者&#xff1a;Fan Wu, Linyi Li, Chejian Xu 发表会议&#xff1a;2022ICRL 摘要 目前强化学习完成任务的水平已经和人类相接近&#xff0c;因此研究人员的目光开始转向…...

Java笔记_18(IO流)

Java笔记_18 一、IO流1.1、IO流的概述1.2、IO流的体系1.3、字节输出流基本用法1.4、字节输入流基本用法1.5、文件拷贝1.6、IO流中不同JDK版本捕获异常的方式 二、字符集2.1、GBK、ASCII字符集2.2、Unicode字符集2.3、为什么会有乱码2.4、Java中编码和解码的代码实现2.5、字符输…...

前端vue3一键打包发布

一键打包发布可以分为两种&#xff0c;一是本地代码&#xff0c;编译打包后发布至服务器&#xff0c;二是直接在服务器上拉去代码打包发布至指定目录中。 两种各有使用场景&#xff0c;第一种是前端开发自己调试发布用的比较多&#xff0c;第二种是测试或者其他人员用的多&…...

13 | visual studio与Qt的结合

1 前提 Qt 5.15.2 visual studio 2019 vsaddin 2.8 2 具体操作 2.1 visual studio tool 2.1.1 下载 https://visualstudio.microsoft.com/zh-hans/downloads/2.1.2 安装 开发...

纯手动搭建大数据集群架构_记录019_集群机器硬盘爆满了_从搭建虚拟机开始_做个200G的虚拟机---大数据之Hadoop3.x工作笔记0179

今天突然就发现,使用nifi的时候集群满了...气死了.. 而在vmware中给centos去扩容,给根目录扩容,做的时候,弄了一天...最后还是报错, 算了从头搭建一个200G的,希望这次够用吧.后面再研究一下扩容的问题. 2023-05-12 11:06:48 原来的集群的机器,硬盘太小了,扩容不知道怎么回事…...

变量大小:—揭开不同类型的字节数

变量大小&#xff1a;一一揭开不同类型的字节数 在编程中&#xff0c;我们会使用各种类型的变量来存储数据&#xff0c;但是你是否知道这些变量在内存中所占用的字节数是多少呢&#xff1f;随着不同编程语言和不同的操作系统&#xff0c;这些变量的字节数可能会有所不同。在本…...

23.自定义指令

像是 v-if,v-for,v-model 这些是官方指令&#xff0c;vue允许开发者自定义指令 目录 1 mounted 1.1 基本使用 1.2 第一个形参 1.3 第二个形参 2 updated 3 函数简写 4 全局自定义指令 1 mounted 当指令绑定到元素身上的时候&#xff0c;就会自动触发mounted()…...

OPNET Modeler 例程——停等协议的建模和仿真

文章目录 一、概述二、链路模型和包格式创建三、进程模型1.src 进程模型2.sink 进程模型 四、节点模型五、网络模型六、仿真结果 一、概述 本例程是在 OPNET Modeler 中对停等协议的建模和仿真&#xff0c;其中停等协议的操作过程如下&#xff1a; &#xff08;1&#xff09;发…...

JavaScript - 基础+WebAPI(笔记)

前言&#xff1a; 求关注&#x1f62d; 本篇文章主要记录以下几部分&#xff1a; 基础&#xff1a; 输入输出语法&#xff1b;数据类型&#xff1b;运算符&#xff1b;流程控制 - 分支语句&#xff1b;流程控制 - 循环语句&#xff1b;数组 - 基础&#xff1b;函数 - 基础&…...

API调用的注意事项及好处!

API调用是指一个软件系统通过预定格式、协议和框架&#xff0c;向另一个软件系统发送请求并获得响应的过程。 在进行API调用时需要注意以下事项&#xff1a; 1. 认真阅读API文档&#xff1a;在调用API前&#xff0c;一定要认真仔细地阅读相关的API文档&#xff0c;了解API接口…...

ros2中常用命令,与ros1的区别

文章目录 1. ros1 中的rosrun tf tf_echo 在ros2中使用办法2. rqt 中 tf 树的查看3. roscd 在ros2中使用办法4. ros2获取时间的方法&#xff1a; 1. ros1 中的rosrun tf tf_echo 在ros2中使用办法 # ros2 run tf2_ros tf2_echo [reference_frame] [target_frame] ros2 run tf2…...

利用MySQL语句批量替换指定wordpress文章中的图片路径

很多时间我们将服务器中的图片下载到本地&#xff0c;然后删掉&#xff0c;但是有一个问题就是&#xff0c;所有文章中的图片路径还是以前的&#xff0c;没有根据域名来。导致下午某些时间段图片都是无法显示的&#xff0c;后来想到用MySQL直接批量替换&#xff0c;执行才不到1…...

Linux必会100个命令(六十)curl

在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具&#xff0c;可以说是一款很强大的http命令行工具。它支持文件的上传和下载&#xff0c;是综合传输工具。 curl选项比较多&#xff0c;使用man curl或者curl -h获取帮助信息。 -a/--append …...

物联网硬件安全与整改梳理(1)

物联网安全工作梳理(0)_luozhonghua2000的博客-CSDN博客 上篇讲了物联网总体安全知识框架和工作梳理,这篇单独讲下硬件安全方面的问题和整改知识技能点。硬件安全主要分5个方面来讲:硬件安全现状,硬件安全技术分析,典型案例,安全架构整改,安全整改措施。 智能硬件安全总…...

【大数据学习篇3】HDFS命令操作与MR单词统计

1. HDFS命令使用 [rootmaster bin]# su hd[hdmaster bin]$ #查看/目录[hdmaster bin]$ hdfs dfs -ls / 5 #在/目录创建一个为test名字的文件夹[hdmaster bin]$ hdfs dfs -mkdir /test#查看/目录[hdmaster bin]$ hdfs dfs -ls Found 1 itemsdrwxr-xr-x - hd supergroup …...

java中设计模式总结

设计模式是实际工作中写的各种代码进行高层次抽象的总结&#xff0c;其中最出名的当属 Gang of Four (GoF) 的分类了&#xff0c;他们将设计模式分类为 23 种经典的模式&#xff0c;根据用途又可以分为三大类&#xff0c;分别为创建型模式、结构型模式和行为型模式。 有一些重…...