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

Java面向对象高级【注解和反射】

目录

注解

什么是注解?

自定义注解

元注解

反射

什么是反射

静态语言和动态语言

动态语言

静态语言

对比

Class类

Java内存分析

类加载过程

类加载器

获取运行时类的完整结构

通过Class对象实例化对象

1.调用Class对象的newInstance

2.Constructor类的newInstance

调用对象的方法和属性 

调用指定的方法

调用指定的属性

反射操纵注解


注解

什么是注解?

  1. Annotation是从JDK1.5开始引入的技术
  2. Annotation的作用:
    1. 不是程序本身,可以对程序做出解释。(和注释差不多)
    2. 可以被其他程序读取
  3. Annotation的格式:
    1. 注解是以“@参数名”在代码中存在的,还可以添加一些参数值,比如元注解:@SuppressWarnings(value="unchecked").
  4. Annotation在哪里使用?
    1. 可以附加在package、class、method、field等上面,相当于给他们添加了额外的辅助信息,我们可以同反射机制来实现对这些元数据的访问

自定义注解

  • 使用 @interface 自定义注解时,自动继承了java.lang.annotation.Annotation 接口。
  • 分析
    • @interface 用来声明一个注解,格式:public @interface 注解名 { 方法名()... }
    • 其中每一个方法实际上是一个配置参数
    • 方法名称就是参数名称
    • 返回值类型就是参数类型
    • 可以通过default来声明参数的默认值
    • 如果只有一个参数成员,一般参数名用value
    • 注解必须要有值,我们定义注解时,经常使用空字符串、0作为默认值

元注解

  • 元注解的作用就是负责注解其他注解,Java定义了4个标准的 meta-annotation类型,它们被用来提供对其他annotation类型作说明
  • 这些类型和它们所支持的类在 java.lang.annotation中可以找到(@Target、#Documented、@Inherrited、@Retention)
    • @Target:用于描述注解的使用范围(即注解可以标注在什么地方,类上面或者方法、属性等)
    • @Retention:表示在什么级别保存该注释信息,用于描述注解的声明周期
      • SOURCE:源码阶段-就是写代码的时候] 
      • CLASS :表示注解将在编译时被保留,并且会被包含在类文件中,但在运行时不可用。但这意味着,当程序运行时,无法访问该注解。
      • RUNTINUE :程序运行时,可以访问该注解(通过反射)。
    • @Documented:说明该注解将被包含在javadoc中。(javadoc是Java语言中自带的一种工具,用于生成API文档。)
    • @Inherited:说明子类可以继承父类的注解

反射

什么是反射

  • Java中的反射是指程序在运行时动态地获取类的信息以及操作类的成员变量、方法和构造方法的能力。
  • 通过反射,可以在运行时检查类的属性和方法,获取类的构造函数并实例化对象,调用类的成员变量和方法,甚至可以在运行时动态地生成新的类,这使得Java程序具有更大的灵活性和动态性。
  • 但是,反射机制也会导致一些性能上的问题,因为反射调用的速度通常比直接调用要慢得多。

Java中的反射主要API:

  1. Class类:用于表示Java类的信息,包括类的名称、父类、接口、构造函数、成员变量和方法等。
  2. Constructor类:用于表示Java类的构造函数信息。
  3. Method类:用于表示Java类的方法信息。
  4. Field类:代表类的成员变量

        反射机制的核心是在运行时动态地获取类的信息,并通过这些信息来调用类的成员变量和方法,这种能力使得Java程序可以在运行时动态地加载和执行代码,从而实现更加灵活和动态的功能。

静态语言和动态语言

动态语言

  • 动态语言是指在运行时进行类型检查的语言。在编写程序时,不需要明确指定变量的数据类型,变量的类型会在运行时根据赋值的内容自动推断。因此,动态语言往往比静态语言更灵活,更容易编写和修改。
  • 常见的动态语言包括Python、JavaScript和Ruby等。

静态语言

  • 静态语言是指在编译时进行类型检查的语言。在编写程序时,需要明确指定变量的数据类型,并在编译时检查所有变量和表达式的类型是否匹配。如果存在类型不匹配的情况,编译器会报错并终止编译。
  • Java、C++和C#等语言都是静态语言。

对比

  • 总之,静态语言在编写时需要明确指定类型,编译时会进行类型检查,更加严格和安全,但也更加繁琐;动态语言在编写时不需要指定类型,运行时会自动推断类型,更加灵活和易用,但也更加容易出错。

Class类

        在Java中,Class类是代表类的实体,它是Java反射机制的核心,用于获取类的信息、创建对象和调用方法等。Class类提供了以下常用的方法:

  1. getName():获取类的完整名称;
  2. newInstance():创建类的实例,等同于使用new关键字构造对象;
  3. getConstructors():获取类的所有公共构造器;
  4. getMethods():获取类的所有公共方法,包括继承的方法;
  5. getDeclaredFields():获取类的所有成员变量,不包括继承的变量;
  6. getDeclaredMethods():获取类的所有方法,不包括继承的方法;
  7. getSuperclass():获取类的父类;
  8. isAssignableFrom(Class c):判断当前类是否可以赋值给参数类c;
  9. isInstance(Object obj):判断当前对象是否为指定类的实例;
  10. isArray():判断当前类是否为数组类型。

        Class类的一个重要应用是Java反射机制。通过Class类获取类的信息,可以实现在运行时动态创建对象、调用方法和访问成员变量等功能,增加了程序的灵活性和动态性。同时,反射机制也带来了一定的性能开销,因此应该慎重使用。

无论一个.java文件中有多少个类,最终都只有一个Class对象。

Java内存分析

在Java应用程序中,内存主要分为三个区域:堆、栈和方法区。

  1. 堆(Heap)用于存储对象实例,堆是Java中最大的内存分配区域。堆内存的大小可以通过-Xmx和-Xms参数来指定,-Xmx表示最大堆内存,-Xms表示初始堆内存。
  2. 栈(Stack)用于存储方法调用的信息,每个线程都有自己的栈空间。栈内存的大小是固定的,并且在线程创建时分配。栈中存储着局部变量、方法参数、方法返回值和方法调用的状态等信息。
  3. 方法区(Method Area)用于存储类的信息、静态变量、常量等数据。方法区属于堆的一部分,但是它的作用和用途与堆不同。

类加载过程

Java的类加载过程分为三个步骤:加载、链接和初始化。其中,加载和链接是在程序运行时进行的,而初始化在类被首次使用时进行。

  • 加载:将类的字节码文件加载到内存中,并在内存中创建一个Class对象,用于表示该类的信息。ClassLoader负责查找和加载类的字节码文件,将字节码文件读入内存,并创建Class对象,并将其保存在方法区中。
  • 链接:在链接阶段,虚拟机会对类进行验证、准备和解析。
  • 验证:验证字节码文件的正确性,包括验证文件格式、元数据、字节码和符号引用等是否符合规范。
  • 准备:为类的静态变量分配内存,并设置默认初始值,例如int类型的默认值为0,对象类型的默认值为null。这些内存都在方法区中进行分配。
  • 解析:将符号引用解析为直接引用,例如将方法调用的符号引用解析为实际的方法地址。
  • 初始化:在类被首次使用时进行,虚拟机会执行类的初始化操作,包括执行类的静态代码块和静态变量的初始化。
  • 执行静态代码块:静态代码块是在类被初始化时执行的,它可以用来进行一些静态资源的初始化工作。
  • 静态变量初始化:静态变量的初始化也是在类被初始化时进行的,它可以通过赋初值或静态代码块来进行初始化。

        类的加载过程是Java虚拟机实现动态性的重要基础,也是Java的重要特性之一。通过自定义ClassLoader,可以实现类的动态加载和替换,这为Java应用程序带来了更大的灵活性和动态性。

类加载器

获取运行时类的完整结构

        通过Java反射可以获取类的运行时完整结构,包括类的构造器方法字段注解泛型等信息,具体步骤如下:

  • 获取Class对象:使用 lass.forName() 方法或者类名.class 获取需要反射的类的Class对象。
  • 获取构造器:使用 getConstructors() 方法获取类的所有公共构造器,使用getDeclaredConstructors() 方法获取类的所有构造器(包括私有构造器)
  • 获取方法:使用 getMethods() 方法获取类的所有公共方法,使用 getDeclaredMethods() 方法获取类的所有方法(包括私有方法)
  • 获取字段:使用 getFields() 方法获取类的所有公共字段,使用 getDeclaredFields() 方法获取类的所有字段(包括私有字段)
  • 获取注解:使用 getAnnotations() 方法获取类的所有注解,使用 getDeclaredAnnotations()方法获取类的所有注解(包括私有注解)。
  • 获取泛型:使用 getGenericSuperclass() 方法获取类的带有泛型的父类,使用getGenericInterfaces() 方法获取实现的所有接口(包括带有泛型的接口)。

        通过反射获取类的运行时完整结构可以实现动态调用、动态代理和动态生成代码等功能,但是反射的性能较低,应该尽量避免在性能要求高的场景中使用。

通过Class对象实例化对象

1.调用Class对象的newInstance

        使用newInstance()方法创建类的实例,该方法会调用类的默认构造器来创建对象。

        需要注意的是,newInstance()方法只能调用类的默认构造器来创建对象,如果类没有默认构造器或者默认构造器不可访问,则会抛出InstantiationException异常。如果需要调用其他构造器来创建对象,则需要使用Constructor类的newInstance()方法。

2.Constructor类的newInstance

Class<?> c1 = Class.forName("com.reflection.test.User");
//用含参的构造器创建对象Constructor<?> constructor = c1.getDeclaredConstructor(String.class, int.class, int.class);User user1 = (User)constructor.newInstance("张三", 1, 20);

调用对象的方法和属性 

调用指定的方法

通过反射,调用类中的方法,通过Method类完成。

通过Class对象的 getMethod() 或者 getDeclaredMethod() 方法来获得一个Method对象,并设置此方法操作时需要的参数类型。

然后使用 invoke 进行调用

Class<?> c1 = Class.forName("com.refelection.test.User");//获得Class类对象
User user = (User) c1.newInstance();//初始化对象Method setName = c1.getDeclaredMethod("setName", String.class);
setName.invoke(user,"张三");    //调用user的setName方法将user对象的name属性设置为"张三"

 如果方法为private,需要关闭安全检测setAccessible(true)

setName.setAccessible(true);

调用指定的属性

 //获得属性
Field name = c1.getDeclaredField("name");
name.set("name","张三");//设置属性

同样如果属性为private,需要关闭安全检测setAccessible(true)

name.setAccessible(true);//关闭权限检测

反射操纵注解

在Java中,通过反射可以操作注解,具体步骤如下:

  • 获取注解信息使用Class、Method、Field等类的getAnnotation()方法获取注解信息,例如使用getAnnotation()方法获取类、方法或属性上的注解信息,使用getAnnotations()方法获取类、方法或属性上的所有注解信息。
  • 解析注解信息:使用Annotation类的相关方法解析注解信息,例如使用annotationType()方法获取注解的类型,使用value()方法获取注解的属性值等
import java.lang.annotation.*;
import java.lang.reflect.Field;/*** 反射操作注解*/
public class Test12 {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {//获得Class对象Class<?> c1 = Class.forName("reflection.Student2");//通过反射获得注解Annotation[] annotations = c1.getAnnotations();for (Annotation annotation : annotations) {System.out.println(annotation);//@reflection.TableInfo(value=db_student)}//获得注解的 value 的值TableInfo tableInfo = c1.getAnnotation(TableInfo.class);String value = tableInfo.value();System.out.println(value);//db_student//获得类指定的注解Field f = c1.getDeclaredField("name");FieldInfo fieldInfo = f.getAnnotation(FieldInfo.class);System.out.println(fieldInfo.columnName());//db_nameSystem.out.println(fieldInfo.type());//varcharSystem.out.println(fieldInfo.length());//10}
}@TableInfo("db_student")
class Student2{@FieldInfo(columnName = "db_id",type = "int",length = 10)private int id;@FieldInfo(columnName = "db_age",type = "int",length = 10)private int age;@FieldInfo(columnName = "db_name",type = "varchar",length = 10)private String name;public Student2(){}public Student2(int id, int age, String name) {this.id = id;this.age = age;this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Student2{" +"id=" + id +", age=" + age +", name='" + name + '\'' +'}';}
}//类名的注解
@Target(ElementType.TYPE)//作用范围 类
@Retention(RetentionPolicy.RUNTIME)//作用的生命周期 运行时
@interface TableInfo{String value();
}//属性的注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface  FieldInfo{String columnName();String type();int length();
}

相关文章:

Java面向对象高级【注解和反射】

目录 注解 什么是注解&#xff1f; 自定义注解 元注解 反射 什么是反射 静态语言和动态语言 动态语言 静态语言 对比 Class类 Java内存分析 类加载过程 类加载器 获取运行时类的完整结构 通过Class对象实例化对象 1.调用Class对象的newInstance 2.Constructor…...

Pytorch基础 - 4. torch.expand() 和 torch.repeat()

目录 1. torch.expand(*sizes) 2. torch.repeat(*sizes) 3. 两者内存占用的区别 在PyTorch中有两个函数可以用来扩展某一维度的张量&#xff0c;即 torch.expand() 和 torch.repeat() 1. torch.expand(*sizes) 【含义】将输入张量在大小为1的维度上进行拓展&#xff0c;…...

《LeetCode》——LeetCode刷题日记

本期&#xff0c;将给大家带来的是关于 LeetCode 的关于二叉树的题目讲解。 目录 &#xff08;一&#xff09;606. 根据二叉树创建字符串 &#x1f4a5;题意分析 &#x1f4a5;解题思路 &#xff08;二&#xff09;102. 二叉树的层序遍历 &#x1f4a5;题意分析 &#…...

mysql数据库审计(1)

1.数据库审计工具介绍及选择 1.1. 数据库审计工具介绍 MySQL 分支的审计功能包含在企业版中&#xff0c;社区版可以使用其他分支提供的工具。目前已知的审计工具&#xff0c;社区版本有 Percona 的 Percona Server Audit Log 、MariaDB 的 MariaDB Audit Plugin 和 McAfee 的…...

Kafka---kafka概述和kafka基础架构

kafka概述和kafka基础架构 文章目录kafka概述和kafka基础架构Kafka定义消息队列传统消息队列应用场景缓存/消峰解耦异步通信消息队列的两种模式点对点模式发布/订阅模式kafka基础架构producerConsumerConsumer Group&#xff08;CG&#xff09;BrokerTopicPartitionReplicaLead…...

《JavaEE初阶》多线程基础

《JavaEE初阶》多线程基础 文章目录《JavaEE初阶》多线程基础前言:多线程的概念简单创建线程并运行:简述Thread中run方法与start方法的区别创建线程的几种方法:探讨串行执行与并行执行的执行时间多线程的使用场景:Thread类简单介绍:构造方法:获取线程的常见属性:线程的常用方法…...

技术分享 | OMS 初识

作者&#xff1a;高鹏 DBA&#xff0c;负责项目日常问题排查&#xff0c;广告位长期出租 。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 本文主要贡献者&#xff1a;进行OMS源码分析的…...

【Elastic (ELK) Stack 实战教程】10、ELK 架构升级-引入消息队列 Redis、Kafka

目录 一、ELK 架构面临的问题 1.1 耦合度过高 1.2 性能瓶颈 二、ELK 对接 Redis 实践 2.1 配置 Redis 2.1.1 安装 Redis 2.1.2 配置 Redis 2.1.3 启动 Redis 2.2 配置 Filebeat 2.3 配置 Logstash 2.4 数据消费 2.5 配置 kibana 三、消息队列基本概述 3.1 什么是…...

优先、双端队列-我的基础算法刷题之路(八)

本篇博客旨在整理记录自已对优先队列、双端队列的一些总结&#xff0c;以及刷题的解题思路&#xff0c;同时希望可给小伙伴一些帮助。本人也是算法小白&#xff0c;水平有限&#xff0c;如果文章中有什么错误之处&#xff0c;希望小伙伴们可以在评论区指出来&#xff0c;共勉 &…...

Python3 os.symlink() 方法、Python 质数判断

Python3 os.symlink() 方法 概述 os.symlink() 方法用于创建一个软链接。 语法 symlink()方法语法格式如下&#xff1a; os.symlink(src, dst)参数 src -- 源地址。 dst -- 目标地址。 返回值 该方法没有返回值。 实例 以下实例演示了 symlink() 方法的使用&#xff1…...

P1972 [SDOI2009] HH的项链

[SDOI2009] HH的项链 题目描述 HH 有一串由各种漂亮的贝壳组成的项链。HH 相信不同的贝壳会带来好运&#xff0c;所以每次散步完后&#xff0c;他都会随意取出一段贝壳&#xff0c;思考它们所表达的含义。HH 不断地收集新的贝壳&#xff0c;因此&#xff0c;他的项链变得越来…...

​力扣解法汇总1026. 节点与其祖先之间的最大差值

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 给定二叉树的根节点 root&#xff0c;找出存在于 不同 节点 A 和 B 之间的最大值…...

010:Mapbox GL移动鼠标mousemove,显示坐标信息

第010个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中移动鼠标mousemove,显示坐标信息。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共81行)相关API参考:专栏目标示例效果 配置方式 1)查看基础…...

【两阶段鲁棒优化】利用列-约束生成方法求解两阶段鲁棒优化问题(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

百度暑期实习 C++ 一面

1.数组 链表 数组是一种线性数据结构&#xff0c;其中相同类型的元素连续存储在一段内存中&#xff0c;并且可以通过索引来访问每个元素。数组的优点是随机访问元素非常快速&#xff0c;但缺点是插入或删除元素可能需要移动其他元素。 链表也是一种线性数据结构&#xff0c;但…...

计算机网络第一章(概述)【湖科大教书匠】

1. 各种网络 网络(Network)由若干**结点(Node)和连接这些结点的链路(Link)**组成多个网络还可以通过路由器互连起来&#xff0c;这样就构成了一个覆盖范围更大的网络&#xff0c;即互联网(互连网)。因此&#xff0c;互联网是"网络的网络(Network of Networks)"**因特…...

【JS】vis.js使用之vis-timeline使用攻略,vis-timeline在vue3中实现时间轴、甘特图

vis.js使用之vis-timeline使用攻略&#xff0c;vis-timeline实现时间轴、甘特图1、vis-timeline简介2、安装插件及依赖3、简单示例4、疑难问题集合1. 中文zh-cn本地化2. 关于自定义class样式无法被渲染3. 关于双向数据绑定vis.js是一个基于浏览器的可视化库&#xff0c;它提供了…...

机器学习——数据处理

机器学习简介 机器学习是人工智能的一个实现途径深度学习是机器学习的一个方法发展而来 机器学习&#xff1a;从数据中自动分析获得模型&#xff0c;并利用模型对未知数据进行预测。 数据集的格式&#xff1a; 特征值目标值 比如上图中房子的各种属性是特征值&#xff0c;然…...

多种文字翻译软件-翻译常用软件

整篇文档翻译软件 整篇文档翻译软件是一种实现全文翻译的自动翻译工具&#xff0c;它能够快速、准确地将整篇文档的内容翻译成目标语言。与单词、句子翻译不同&#xff0c;整篇文档翻译软件不仅需要具备准确的语言识别和翻译技术&#xff0c;还需要考虑上下文语境和文档格式等多…...

Baumer工业相机堡盟工业相机如何通过BGAPI SDK将相机图像数据用二进制的方式保存到本地(C++)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK将相机图像数据用二进制的方式保存到本地&#xff08;C&#xff09;Baumer工业相机Baumer工业相机将图像保存为二进制图像的技术背景代码分析第一步&#xff1a;先转换Byte*图像为二进制图像第二步&#xff1a;在回调函数里进行Buf…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...

拟合问题处理

在机器学习中&#xff0c;核心任务通常围绕模型训练和性能提升展开&#xff0c;但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正&#xff1a; 一、机器学习的核心任务框架 机…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001

qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类&#xff0c;直接把源文件拖进VS的项目里&#xff0c;然后VS卡住十秒&#xff0c;然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分&#xff0c;导致编译的时候找不到了。因…...

【QT】qtdesigner中将控件提升为自定义控件后,css设置样式不生效(已解决,图文详情)

目录 0.背景 1.解决思路 2.详细代码 0.背景 实际项目中遇到的问题&#xff0c;描述如下&#xff1a; 我在qtdesigner用界面拖了一个QTableView控件&#xff0c;object name为【tableView_electrode】&#xff0c;然后【提升为】了自定义的类【Steer_Electrode_Table】&…...