15. Java反射和注解
Java —— 反射和注解
- 1. 反射
- 2. 注解
1. 反射
动态语言:变量的类型和属性可以在运行时动态确定,而不需要在编译时指定 常见动态语言:Python,JavaScript,Ruby,PHP,Perl;常见静态语言(C,C++,C#,Go,Java) Java:Java并不算是严格意义上的动态语言,从反射角度来说属于半动态语言(能通过反射机制实现了部分动态编程的能力) Java反射机制:Java编程语言提供的一种强大的特性,它允许程序在运行时动态地获取类的信息,并通过该信息操作类的成员变量、方法和构造函数 |
Java 的反射机制:在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法
Java反射常用API
Class 类
:反射的核心类,可以获取类的属性,方法等信息
Field 类
:Java.lang.reflec 包中的类,表示类的成员变量,可以用来获取和设置类之中的属性值
Method类
: Java.lang.reflec 包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法
Constructor 类
: Java.lang.reflec 包中的类,表示类的构造方法
获取Class对象的3种方法
调用某个对象的getClass()
方法
❶ 类名 对象名 = new 类名();
❷ Class 类对象名 = 对象名.getClass();
使用Class类中的forName()
静态方法(安全且性能好)
❸ Class 类对象名 = Class.forName(“类的完全限定名”);
高版本Java创建:var 类对象名 = 类名(需要创建类对象的类).class;
Class<类型(类名)> 类对象名 = 类名(需要创建类对象的类.class;
- 对应类的常用方法
- 对应代码
package reflect;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/*** 反射机制*/public class TestDemo {public static void main(String[] args) throws NoSuchMethodException,InvocationTargetException, IllegalAccessException,InstantiationException, NoSuchFieldException {// 创建类对象var classes = Information.class;System.out.println("类名:" + classes.getSimpleName());// 根据类获取当前类的完全限定名String className = classes.getName();System.out.println("当前类的完全限定名:" + className);// 根据获取当前类的包名String packageName = classes.getPackageName();System.out.println("包名:" + packageName);// 根据类获取当前普通方法名List<String> list = new ArrayList<>();Method[] methods = classes.getMethods();for (Method method : methods) {list.add(method.getName());}System.out.println("public方法个数:" + list.size());System.out.println("public方法:" + list);// 获取构造器(无参构造器)Constructor<Information> constructor = classes.getConstructor();// 利用无参构造器创建实例Object obj = constructor.newInstance();// 获取指定的普通方法,带参数Method publicMethod = classes.getMethod("publicMethod", String.class, int.class);// 获取指定私有方法Method privateMethod = classes.getDeclaredMethod("privateMethod", String.class);System.out.println("获取指定私有方法:" + privateMethod);// 强行开启私有方法访问权限privateMethod.setAccessible(true);// 获取所有普通public属性Field[] fields = classes.getFields();System.out.println("普通属性:" + Arrays.toString(fields));// 获取所有属性Field[] declaredFields = classes.getDeclaredFields();System.out.println("所有属性:" + Arrays.toString(declaredFields));// 获取属性名for (Field field:declaredFields) {String name = field.getName();System.out.print(name + ", ");}System.out.println();// 访问单个私有属性Field name = classes.getDeclaredField("name");// 强行打开权限name.setAccessible(true);System.out.println("访问单个私有属性:名称:" + name.getName() + " 类型:" +name.getType() + " 权限修饰符(二进制位标识的修饰符信息):" + name.getModifiers());// 私有方法调用privateMethod.invoke(obj, "零零");// 方法调用publicMethod.invoke(obj, "夏鸥", 22);System.out.println("无参构造器创建的实例:" + obj);// 获取有参构造器Constructor<Information> constructors = classes.getConstructor(String.class, int.class, String.class);// 有参构造器创建实例Object object = constructors.newInstance("王菲", 20, "2020002");// 获取指定的普通方法Method classesMethod = classes.getMethod("publicMethod");// 方法调用classesMethod.invoke(object);System.out.println("有参构造器创建的实例:" + object);}
}class Information{private String name = "赫敏";private int age = 20;public String num = "2020001";public Information() {}public Information(String name, int age, String num) {this.name = name;this.age = age;this.num = num;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getNum() {return num;}public void setNum(String num) {this.num = num;}@Overridepublic String toString() {return "TestDemo{" +"name='" + name + '\'' +", age=" + age +", num='" + num + '\'' +'}';}private void privateMethod() {System.out.println(name + " 私有方法");}private void privateMethod(String name) {this.name = name;System.out.println(name + " 私有方法");}public void publicMethod() {System.out.println(name + " 普通方法");}public void publicMethod(String name, int age) {this.name = name;this.age = age;System.out.println(name + age + " 普通方法");}
}
- 应用实例
package reflect;import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.net.URISyntaxException;
import java.net.URL;/*** 要求:实例化与当前类在统一和包中的所有类*/
public class Instantiations {public static void main(String[] args) throws ClassNotFoundException, URISyntaxException, NoSuchMethodException,InvocationTargetException, InstantiationException, IllegalAccessException {/* 1. 获取当前包中的所有类名 */// 获取包名String packageName = Instantiations.class.getPackageName();// 获取当前绝对路径资源 ".":表示当前路径URL path = Instantiations.class.getResource(".");// 获取路径下的所有文件File file = new File(path.toURI());// 将所需文件过滤存储到数组(所有类)File[] files = file.listFiles(f -> f.getName().endsWith(".class"));// 获取到for (File sub:files) {String name = sub.getName();// 获取类名String className = name.replace(".class", "");System.out.println("实例化类:" + packageName + "." + className);Class<?> classes = Class.forName(packageName + "." + className);// 通过无参构造器创建实例Object obj = classes.getConstructor().newInstance();System.out.println(obj);}}
}
2. 注解
注解:元数据 / 注解(注解Annotation是一个接口),一种提供程序中元素信息和数据的途径和方法 作用:在不改变程序主体逻辑的情况下,为程序员提供额外的元数据信息(标记一段代码的功能、作用范围、参数要求等信息) |
4种标准元注解:元注解的作用是负责注解其他注解
❶ @Target 注解修饰范围 / 修饰的目标元素类型
❷ @Retention:注解生命周期 / 保留级别 / 被保留的时间长短
❸ @Documented注解是否会被包含在Java文档中生成
❹ @Inherited注解是否可以被继承
@Target元素类型
ElementType.TYPE
:类、接口或枚举类型
ElementType.FIELD
:字段或属性
ElementType.METHOD
:方法
ElementType.PARAMETER
:方法参数
ElementType.CONSTRUCTOR
:构造函数
ElementType.LOCAL_VARIABLE
:局部变量
ElementType.ANNOTATION_TYPE
:注解类型
ElementType.PACKAGE
:包
@Retention的三个值
RetentionPolicy.SOURCE
:注解仅存在于源代码中,编译时会被丢弃
RetentionPolicy.CLASS
:注解存在于源码和编译后的字节码文件中,但在运行时会被丢弃(默认值)
RetentionPolicy.RUNTIME
:注解在运行时保留在字节码文件中,可以通过反射机制读取
@Documented和@Inherited
一个注解被@Documented修饰,那么它的信息将会被包含在生成的文档中
一个注解被@Inherited修饰,表示该注解可以被子类继承
- 基本原则:不直接干扰程序代码的运行
Java 注解是一种元数据,它可以提供对程序元素(如类、方法、字段等)的额外信息或配置,并且不会直接影响程序的运行逻辑,只是一种机制,用于存储和传递额外的信息
-
注解分类
-
声明注解及变长参数
package reflect.annotations;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;// 注解类型
@Target(ElementType.METHOD)
// 注解级别
@Retention(RetentionPolicy.RUNTIME)
// 声明注解
public @interface AutoRunMethod {// 注解的参数(当注解下的参数只有一个时,一般用value)int value() default 1;String name() default "张三";
}
- 使用注解
package reflect;import reflect.annotations.AutoRunClass;
import reflect.annotations.AutoRunMethod;import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URISyntaxException;
import java.util.Arrays;public class Reflect {public static void main(String[] args) {// 加载包下被注解的类被注解的方法try {String packName = Reflect.class.getPackage().getName();File dir = new File(Reflect.class.getResource(".").toURI());File[] subs = dir.listFiles(f->f.getName().endsWith(".class"));for (File sub:subs) {String className = sub.getName().replace(".class","");Class classes = Class.forName(packName + "." + className);if (classes.isAnnotationPresent(AutoRunClass.class)){System.out.println("实例化:" + className);Constructor constructor = classes.getConstructor();Object obj = constructor.newInstance();System.out.println(obj);// 方法名获取Method[] methods = classes.getDeclaredMethods();for (Method method:methods) {// 判断该方法是否被注解if (method.isAnnotationPresent(AutoRunMethod.class)){System.out.println("调用方法:" + method.getName() + "()");// 获取注解参数AutoRunMethod arm = method.getAnnotation(AutoRunMethod.class);// 获取值(定义时将其认为参数,调用时看作方法)int value = arm.value();String name = arm.name();System.out.println("注解参数的值:" + value + name);// 根据注解参数的值调用方法for (int i = 0; i < value; i++) {// 方法调用method.invoke(obj);}}}}}} catch (URISyntaxException | ClassNotFoundException |NoSuchMethodException | InstantiationException |IllegalAccessException | InvocationTargetException e) {throw new RuntimeException(e);}}
}// 注解类
@AutoRunClass
class Student {public String address = "贵阳市花溪区";private String name = "赵涛";private char gender = '男';private int age = 15;public Student() {}public Student(String name, char gender, int age) {this.name = name;this.gender = gender;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}// 注解方法@AutoRunMethod(3)public void sayHi() {System.out.println(name + ":你好");}@AutoRunMethod(value = 2, name = "李四")public void sleep() {System.out.println(name + ":睡觉");}@AutoRunMethod(name = "王五")public void watchTV() {System.out.println(name + ":看电视");}public void playGame() {System.out.println(name + ":玩游戏");}public void say(String info) {System.out.println(name + "说:" + info);}public void say(String info, int count) {System.out.println(name + "说了" + count + "次," + info);}public void study() {System.out.println(name + "学习");}@AutoRunMethodpublic void doHomework() {System.out.println(name + ":做作业");}// **********************普通方法(参数变长)只是Java编译器认可(最终为数组)***************************// 变长参数只能在方的最后一个参数,且一个方法只能有一个变长参数public void doSome(String... s) {System.out.println("参数个数:" + s.length);System.out.println("参数:" + Arrays.toString(s));}private void privateMethod() {System.out.println("这是一个私有方法");}@Overridepublic String toString() {return "Student{" +"address='" + address + '\'' +", name='" + name + '\'' +", gender=" + gender +", age=" + age +'}';}
}
- 变长参数只能在方的最后一个参数,且一个方法只能有一个变长参数
- 注解格式:
类型 参数名() [default 默认值]
注:不指定默认值时使用注解必须传递对应参数- 注解传参机制:
当注解仅有一个参数,且参数名为value时,直接传入参数(不需要参数名)
当注解仅有一个参数,且参数名不为value时,正常使用注解传参语法:参数名=参数值
多个参数传参使用参数名进行传参,传参顺序可以与注解定义时参数顺序不一致
有多个参数时,即使一个注解的参数名为value,在实际使用时参数名也不可以忽略
相关文章:
15. Java反射和注解
Java —— 反射和注解 1. 反射2. 注解 1. 反射 动态语言:变量的类型和属性可以在运行时动态确定,而不需要在编译时指定 常见动态语言:Python,JavaScript,Ruby,PHP,Perl;常见静态语言…...
pdf处理工具 Enfocus PitStop Pro 2022 中文 for mac
Enfocus PitStop Pro 2022是一款专业的PDF预检和编辑软件,旨在帮助用户提高生产效率、确保印刷品质量并减少错误。以下是该软件的一些特色功能: PDF预检。PitStop Pro可以自动检测和修复常见的PDF文件问题,如缺失字体、图像分辨率低、颜色空…...
微信小程序入门开发教程
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《微信小程序开发实战》。🎯Ἲ…...
php函数
1. strstr() 返回a在b中的第一个位置 2.substr() 截取字符串 3.PHP字符串函数parse_str(将字符串解析成多个变量)-CSDN博客 4.explode() 字符串分割为数组 5.trim() 1.去除字符串两边的 空白字符 2.去除指定字符 6.extract()函数从数组里…...
3.3 封装性
思维导图: 3.3.1 为什么要封装 ### 3.3.1 为什么要封装 **封装**,在Java的面向对象编程中,是一个核心的思想。它主要是为了保护对象的状态不被外部随意修改,确保数据的完整性和安全性。 #### **核心思想:** - 保护…...
Redis魔法:点燃分布式锁的奇妙实现
分布式锁是一种用于在分布式系统中控制对共享资源的访问的锁。它与传统的单机锁不同,因为它需要在多个节点之间协调以确保互斥访问。 本文将介绍什么是分布式锁,以及使用Redis实现分布式锁的几种方案。 一、前言 了解分布式锁之前,需要先了…...
iOS 项目避坑:多个分类中方法重复实现检测
#前言 在项目中,我们经常会使用分类 -> category。category在实际项目中一般有两个左右:1.给已有class增加方法,扩充起能力、2.将代码打散到多个文件中,避免因为一个类过于复杂而导致代码篇幅过长(应用于viewController中很好用) 但是 category 也有很多弊端~ **首…...
【003】EIS数据分析_#LIB
EIS数据分析 1. EIS测试及数据获取2. EIS数据分析2.1 EIS曲线划分 1. EIS测试及数据获取 点击查看往期介绍 2. EIS数据分析 2.1 EIS曲线划分 一般来说,实轴处的截获表示体电阻(Rb),它反映了电解质,隔膜和电极的电导率。高频区的半圆对应于…...
Sprint framework Day07:注解结合 xml 配置
前言 Spring注解结合XML配置是指在Spring应用中,使用注解和XML配置的方式来进行Bean的定义、依赖注入和其他配置。这种方式可以充分利用Spring框架的注解和XML配置两种不同的配置方式的特点。 在Spring框架中,我们可以使用注解来定义Bean,如…...
LiveGBS流媒体平台GB/T28181功能-国标流媒体服务同时兼容内网收流外网收流多网段设备收流
LiveGBS流媒体平台GB/T28181功能-国标流媒体服务同时兼容内网收流外网收流多网段设备收流 1、背景2、设备接入播放2.1、查看通道2.2、直播播放 3、默认收流地址配置4、其它网络设备收流配置5、搭建GB28181视频直播平台 1、背景 服务器部署的时候,可能有多个网卡多个…...
js题解(四)
文章目录 批量改变对象的属性判断是否包含数字判断是否符合指定格式 批量改变对象的属性 给定一个构造函数 constructor,请完成 alterObjects 方法,将 constructor 的所有实例的 greeting 属性指向给定的 greeting 变量。 function alterObjects(const…...
如何进行大数运算和高精度计算?
大数运算和高精度计算是在计算机编程中常见的需求,尤其是当处理大整数、分数、复数、浮点数等需要更多位数的数据时。在C语言中,由于原生的数据类型有限,您需要使用自定义的数据结构和算法来执行大数运算和高精度计算。在本文中,我…...
身份证读卡器跟OCR有何区别?哪个好?
二代身份证读卡器(以下简称读卡器)和OCR(光学字符识别)是两种常见的身份证信息获取技术,它们在原理、功能和应用方面存在一些区别。下面将详细介绍二者的区别并探讨哪个更好。 1. 原理: - 读卡器ÿ…...
华为云云耀云服务器L实例评测 | 实例评测使用之硬件参数评测:华为云云耀云服务器下的 Linux 网络监控神器 bmon
华为云云耀云服务器L实例评测 | 实例评测使用之硬件参数评测:华为云云耀云服务器下的 Linux 网络监控神器 bmon 介绍华为云云耀云服务器 华为云云耀云服务器 (目前已经全新升级为 华为云云耀云服务器L实例) 华为云云耀云服务器是什…...
C++ 设计模式 —— 组合模式
C 设计模式 —— 组合模式 0. 引用连接 本文主要的思路和代码,来自于对以下连接的学习和实现: 组合模式 1. 引言 1.1 什么是组合模式? 组合模式的定义组合模式的作用 组合模式是一种行为型设计模式,它将对象组合成树形结构以…...
华为云Stack的学习(九)
十、华为云Stack灾备服务介绍 1.云硬盘备份VBS 云硬盘备份服务(VBS,Volume Backup Service)可为云硬盘(EVS,Elastic Volume Service)创建备份,利用备份数据恢复云硬盘,最大限度保障…...
Flink中jobmanager、taskmanager、slot、task、subtask、Parallelism的概念
场景 一个工厂有三个车间每个车间两条生产线 生产流程如下 原料->加工->过滤->分类->美化->包装->下线 JobManager:工厂 在上述场景中,工厂就是jobManager,负责协调、调度和监控整个生产过程 TaskManager:车间…...
OpenHarmony docker环境搭建
OpenHarmony docker环境搭建 要求一台安装ubuntu的虚拟机,vscode软件 安装docker 在 Ubuntu 上安装 Docker 非常直接。我们将会启用 Docker 软件源,导入 GPG key,并且安装软件包。 首先,更新软件包索引,并且安装必要的依赖软件…...
【计算机网络】网络编程接口 Socket API 解读(11)
Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。 本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。…...
Qt工具开发,该不该跳槽?
Qt工具开发,该不该跳槽? 就这样吧,我怕你跳不动。 嵌入式UI,目前趋势是向着LVGL发展。QT已经在淘汰期了。很多项目还在用,但技术上已经落后。QT短期内不会全面淘汰,但退位让贤的大趋势已经很清楚了。 最近很多小伙伴…...
【深度学习】DDPM,Diffusion,概率扩散去噪生成模型,原理解读
看过来看过去,唯有此up主,非常牛: Video Explaination(Chinese) 1. DDPM Introduction q q q - 一个固定(或预定义)的正向扩散过程,逐渐向图像添加高斯噪声,直到最终得到纯噪声。 p θ p_θ p…...
HT8699:内置 BOOST 升Y双声道音频功率放大器
HT8699是一款内置BOOST升Y模块的立体声音频功率放大器。HT8699具有AB类和D类切换功能,在受到D类功放EMI干扰困扰时,可切换至AB类音频功放模式。 在D类模式下,内置的BOOST升Y模块可通过外置电阻调节升Y值,即使是锂电池供电…...
利达卓越:关注环保事业,持续赋能科技
随着全球环境问题的日益突出,绿色金融作为一种新兴的金融模式逐渐受到各国的重视。绿色金融是指在金融活动中,通过资金、信贷和风险管理等手段,支持环境友好和可持续发展的项目和产业。绿色金融的出现是为了应对气候变化、资源短缺、污染问题等现实挑战,促进经济的绿色转型和可…...
Spring MVC中通过配置文件配置定时任务
Spring MVC中配置定时任务(配置文件方式) 1.步骤 1.步骤 1-1 在springmvc.xml(配置文件)的beans中添加 xmlns:task"http://www.springframework.org/schema/task" http://www.springframework.org/schema/task http…...
AI项目十六:YOLOP 训练+测试+模型评估
若该文为原创文章,转载请注明原文出处。 通过正点原子的ATK-3568了解到了YOLOP,这里记录下训练及测试及在onnxruntime部署的过程。 步骤:训练->测试->转成onnx->onnxruntime部署测试 一、前言 YOLOP是华中科技大学研究团队在2021年…...
Flink报错could not be loaded due to a linkage failure
文章目录 1、报错2、原因3、解决 1、报错 在Flink上提交作业,点Submit没反应,F12看到接口报错信息为: 大概意思是,由于链接失败,无法加载程序的入口点类xx。没啥鸟用的信息,去日志目录继续分析:…...
网络工程师--网络安全与应用案例分析
前言 需要网络安全学习资料的点击链接:【282G】网络安全&黑客技术零基础到进阶全套学习大礼包,免费分享! 案例一: 某单位现有网络拓扑结构如下图所示,实现用户上网功能,该网络使用的网络交换机均为三…...
了解油封对汽车安全的影响?
油封也称为轴封或径向轴封,是车辆发动机、变速箱和其他各种机械系统中的重要部件。它们的主要功能是阻止重要发动机部件的液体(例如油或冷却剂)泄漏,同时防止污染物进入。这些看似简单的任务,但对汽车的安全性和可靠性有着深远的影响。 油封…...
创邻科技Galaxybase—激活数据要素的核心引擎
10月11日下午,创邻科技创始人张晨博士受杭州电子科技大学邀请,前往杭电校园开展交流分享。交流会中,张晨博士为现场的师生带来一场题为《图数据库——激活数据要素的新基建》的精彩分享,探讨数字经济时代底层技术的创新价值与图技…...
【Rust笔记】浅聊 Rust 程序内存布局
浅聊Rust程序内存布局 内存布局看似是底层和距离应用程序开发比较遥远的概念集合,但其对前端应用的功能实现颇具现实意义。从WASM业务模块至Nodejs N-API插件,无处不涉及到FFI跨语言互操作。甚至,做个文本数据的字符集转换也得FFI调用操作系统…...
玻璃生产过程中的窑内压力高精度恒定控制解决方案
摘要:在玻璃生产中对玻璃窑炉中窑压的要求极高,通常需要控制微正压4.7Pa(表压),偏差控制在0.3Pa,而窑炉压力还会受到众多因素的影响,所以实现高稳定性的熔窑压力控制具有很大难度,为…...
创意营销:初期推广的多种策略!
文章目录 🍊 预热🎉 制定预热计划和目标🎉 利用社交媒体传播🎉 创造独特的体验🎉 利用口碑营销🎉 定期发布更新信息🎉 案例说明 🍊 小范围推广🎉 明确目标用户群体&#…...
【小黑嵌入式系统第一课】嵌入式系统的概述(一)
文章目录 一、嵌入式系统基本概念计算机发展的三大阶段CPU——计算机的核心什么是嵌入式系统嵌入式系统的分类 二、嵌入式系统的特点三、嵌入式系统发展无操作系统阶段简单操作系统阶段实时操作系统阶段面向Internet阶段 四、嵌入式系统的应用工业控制 工业设备通信设备信息家电…...
RK平台使用MP4视频做开机动画以及卡顿问题
rk平台android11以后系统都可以使用MP4格式的视频做开机动画,系统源码里面默认使用的是ts格式的视频,其实使用mp4的视频也是可以的。具体修改如下: diff --git a/frameworks/base/cmds/bootanimation/BootAnimation.cpp b/frameworks/base/cmds/bootanimation/BootAnimat…...
通讯网关软件023——利用CommGate X2HTTP实现HTTP访问Modbus TCP
本文介绍利用CommGate X2HTTP实现HTTP访问Modbus TCP。CommGate X2HTTP是宁波科安网信开发的网关软件,软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示,SCADA系统上位机、PLC、设备具备Modbus RTU通讯接口,现在…...
Python性能测试框架Locust实战教程!
01、认识Locust Locust是一个比较容易上手的分布式用户负载测试工具。它旨在对网站(或其他系统)进行负载测试,并确定系统可以处理多少个并发用户,Locust 在英文中是 蝗虫 的意思:作者的想法是在测试期间,放…...
c++视觉处理---仿射变换和二维旋转变换矩阵的函数
仿射变换cv::warpAffine cv::warpAffine 是OpenCV中用于执行仿射变换的函数。仿射变换是一种线性变换,可用于执行平移、旋转、缩放和剪切等操作。下面是 cv::warpAffine 函数的基本用法: cv::warpAffine(src, dst, M, dsize, flags, borderMode, borde…...
uiautomator2遍历子元素.all()
当你获取了页面某个元素之后 elements d(’//*[clickable“true”]’).all() 返回的是一个list,其中是<uiautomator2.xpath.XMLElement>类型的变量。 可以通过以下方式获取它所有子类的信息。 for ele in elements:children ele.elem.getchildren()注意…...
【手写数据库toadb】SQL字符串如何被数据库认识? 词法语法分析基础原理,常用工具
词法语法分析 专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段…...
手把手教你基于windows系统使用GNVM进行node切换版本
GNVM是什么? GNVM 是一个简单的 Windows 下 Node.js 多版本管理器,类似的 nvm nvmw nodist 。 安装 进入官网,下载你所需要的包,直达链接 下载完成 放到我们的node环境包下,点击运行 请注意区分: 不存在 Node.js 环…...
c#画五角星
c#画一个五角星,最重要的就是计算哪些坐标点出来,也是最难的一部分,这要涉及到一些数学方面的知识.对数学坐标知识不是很熟的人,如果想学画图,我建议多去看一下数学书,对我们写程序的人来说是没有什么坏处可言的. 想学习的朋友可以一起学习,我觉得分享学习是一种快乐,所以把自…...
第三章 数据链路层 | 计算机网络(谢希仁 第八版)
文章目录 第三章 数据链路层3.1 使用点对点信道的数据链路层3.1.1 数据链路和帧3.1.2 三个基本问题 3.2 点对点协议PPP3.2.1 PPP协议的特点3.2.2 PPP协议的帧格式3.2.3 PPP协议的工作状态 3.3 使用广播信道的数据链路层3.3.1 局域网的数据链路层3.3.2 CSMA/CD协议3.3.3 使用集线…...
李沐机器学习环境配置相关
李沐机器学习环境配置相关 condapython环境安装指令安装miniconda安装cpu版本torch安装jupyter测试GPU是否可以使用 conda 退出 conda 环境 conda deactivate进入都d2l环境 conda activate d2l启动jupyter notebook: jupyter notebookpython 列出所有安装的包 pip lsit环…...
零基础Linux_16(基础IO_文件)笔试选择题:文件描述符+ionde和动静态库
目录 一. 文件描述符等 1. Linux下两个进程可以同时打开同一个文件,这时如下描述错误的是: 2. 以下关于标准输入输出错误的描述正确的是 3. 以下描述正确的是 4. 以下描述正确的是 [多选] 5. 在bash中,在一条命令后加入”1>&2”…...
基于OpenCV的灰度图的图片相似度计算
from skimage.metrics import structural_similarity as ssim import matplotlib.pyplot as plt import cv2 def picture_recognization(imagname):# 读取两张图片image1 cv2.imread(D:/AutoTest/PythonProject/standard_img/ imagname)image2 cv2.imread(D:/AutoTest/Pytho…...
【python海洋专题二十】subplots_adjust布局调整
上期读取soda,并subplot 但是存在一些不完美,本期修饰 本期内容 subplots_adjust布局调整 1:未调整布局的 2:调整布局 往期推荐 【python海洋专题一】查看数据nc文件的属性并输出属性到txt文件 【python海洋专题二】读取水深…...
TensorFlow入门(二十四、初始化学习参数)
参数的初始化关系到网络能否训练出好的结果或者是以多快的速度收敛,对训练结果有着重要的影响。 初始化学习参数需要注意的规则 不可以将网络中的所有参数初始化为0,也不能全部初始化为同一个值。如果参数全部初始化为0或者是同一个值,会使得所有神经元的输出都是相同的,进而造…...
工厂WMS系统货架位管理:优化仓储效率
货架位管理作为WMS系统中的重要环节,对于提高工厂的仓储效率和精确库存管理至关重要。本文将从多个角度全方位介绍工厂的WMS系统货架位管理,探讨其重要性以及如何优化、应用该系统,提升工厂的仓储效率和运营水平。 1. 优化仓库空间利用&…...
[C++随想录] 继承
继承 继承的引言基类和子类的赋值转换继承中的作用域派生类中的默认成员函数继承与友元继承与静态成员多继承的结构棱形继承的结构棱形虚拟继承的结构继承与组合 继承的引言 概念 继承(inheritance)机制是面向对象程序设计使代码可以 复用的最重要的手段,它允许程序…...
ARM-day9
按键控制小灯、蜂鸣器、风扇,按一次启动,第二次关闭 key_it.c #include "key_it.h"//按键3的配置 void key3_it_config() {//RCC使能GPIOF时钟RCC->MP_AHB4ENSETR | (0x1<<5);GPIOF->MODER & (~(0x3<<16));EXTI->E…...