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

Java:反射、注解

文章目录

  • 1. 反射
    • 1-1. 获取Class对象的三种方式
    • 1-2. 获取类的构造器、实例化对象
    • 1-3. 获取类的成员变量
    • 1-4. 获取类的成员方法
  • 2. 注解
    • 2-1. 元注解
    • 2-2. 解析注解

1. 反射

反射:加载类,并允许以编程的方式解剖类中的各种成员变量、方法、构造器。

1-1. 获取Class对象的三种方式

  1. Class c = 类名.class
  2. 调用Class提供方法:forName(String package),需要提供Java类的文件路径
  3. Object提供的方法:Class c = 对象.getClass()
package Java_fs;class User{}public class JavaFs1 {public static void main(String[] args) throws ClassNotFoundException {Class c = User.class;System.out.println(c.getName());System.out.println(c.getSimpleName());System.out.println("**************************");Class c1 = Class.forName("Java_fs.User");System.out.println(c1 == c);System.out.println("**************************");User user = new User();Class c2 = user.getClass();System.out.println(c2 == c);}
}

在这里插入图片描述

1-2. 获取类的构造器、实例化对象

推荐使用类对象.getDeclaredXXX这种方式来获取,这样可以获取所有的构造器,而不是仅仅得到被public修饰的构造器。
在这里插入图片描述

package Java_fs;import java.lang.reflect.Constructor;class User2{private String name;private Integer age;public User2() {}private User2(String name){this.name = name;}public User2(String name, Integer age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "User2{" +"name='" + name + '\'' +", age=" + age +'}';}
}public class JavaFs2 {public static void main(String[] args) throws NoSuchMethodException {Class c1 = User2.class;System.out.println("获取被public修饰的构造器");Constructor[] constructors = c1.getConstructors();// 只能获取被public修饰的构造器for (Constructor constructor : constructors) {System.out.println("构造器名为:"+constructor.getName());// 获取构造器的名称System.out.println("参数个数为:"+constructor.getParameterCount());// 构造器的参数个数}System.out.println("获取所有的构造器");// 获取所有的构造器Constructor[] constructors2 = c1.getDeclaredConstructors();// 只能获取被public修饰的构造器for (Constructor constructor : constructors2) {System.out.println("构造器名为:"+constructor.getName());// 获取构造器的名称System.out.println("参数个数为:"+constructor.getParameterCount());// 构造器的参数个数}System.out.println("获取指定的构造器。。。。有参数的");Constructor constructor = c1.getDeclaredConstructor(String.class,Integer.class);System.out.println("构造器名为:"+constructor.getName()+"参数个数为:"+constructor.getParameterCount());}
}

在这里插入图片描述
如果想通过这个构造器对象进行实例化,可以直接.newInstance(参数)即可,但是需要某个构造器是私有的,那还是会报错,如下:

package Java_fs;import java.lang.reflect.Constructor;class User2{private String name;private Integer age;public User2() {}private User2(String name){this.name = name;}public User2(String name, Integer age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "User2{" +"name='" + name + '\'' +", age=" + age +'}';}
}public class JavaFs2 {public static void main(String[] args) throws Exception{Class c1 = User2.class;System.out.println("获取指定的构造器。。。。有参数的");Constructor constructor = c1.getDeclaredConstructor(String.class,Integer.class);System.out.println("构造器名为:"+constructor.getName()+"参数个数为:"+constructor.getParameterCount());User2 user = (User2) constructor.newInstance("张三", 20);System.out.println(user);Constructor constructor1 = c1.getDeclaredConstructor(String.class);// constructor1.setAccessible(true);// 禁止检查访问权限User2 user2 = (User2) constructor1.newInstance("张三");System.out.println(user2);}
}

在这里插入图片描述
在这里插入图片描述
这是因为这个一个参数的构造器是被private修饰的,此时如果想强行获取到,可以在构造器下方设置权限,如下::
在这里插入图片描述

1-3. 获取类的成员变量

推荐使用getDeclaredField这种方式来获取,这样所有的都可以获取到。
在这里插入图片描述

package Java_fs;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;class User2{private static int a;private static final String COUNTRY = "China";private String name;public Integer age;@Overridepublic String toString() {return "User2{" +"name='" + name + '\'' +", age=" + age +'}';}
}public class JavaFs2 {public static void main(String[] args) throws Exception{Class c1 = User2.class;Field[] fields = c1.getDeclaredFields();for (Field field : fields) {System.out.println(field);}}
}

在这里插入图片描述
如果想获取指定的成员变量,只需要输入成员变量名即可。如果成员变量被private进行修饰,你想获取成员变量的值或者设置成员变量的值,那么需要设置禁止检查访问权限才行,否则会报错。

package Java_fs;import java.lang.reflect.Field;class User2{private static int a;private static final String COUNTRY = "China";private String name;public Integer age;@Overridepublic String toString() {return "User2{" +"name='" + name + '\'' +", age=" + age +'}';}
}public class JavaFs2 {public static void main(String[] args) throws Exception{Class c1 = User2.class;Field country = c1.getDeclaredField("COUNTRY");country.setAccessible(true);// 设置禁止检查权限User2 user = new User2();String country1 = (String) country.get(user);System.out.println(country1);// 获取成员变量的值Field name = c1.getDeclaredField("name");name.setAccessible(true);name.set(user,"张三");System.out.println(user);}
}

在这里插入图片描述

1-4. 获取类的成员方法

推荐使用getDeclaredXXX这种方式来获取成员方法。
在这里插入图片描述
如果想执行方法对象对应的方法,需要方法对象.invoke(某对象,参数)即可执行对应类下的方法。

package Java_fs;import java.lang.reflect.Field;
import java.lang.reflect.Method;class User2{private static int a;private static final String COUNTRY = "China";private String name;public Integer age;public void setName(String name){this.name = name;}private void happy(String name){System.out.println(name+"哈哈");}private void eat(){System.out.println("吃饭。。");}@Overridepublic String toString() {return "User2{" +"name='" + name + '\'' +", age=" + age +'}';}
}public class JavaFs2 {public static void main(String[] args) throws Exception{Class c1 = User2.class;Method[] methods = c1.getDeclaredMethods();// 获取所有的成员方法for (Method method : methods) {System.out.println(method.getName());}User2 user2 = new User2();Method eat = c1.getDeclaredMethod("eat");eat.setAccessible(true);// 设置禁止检查访问权限eat.invoke(user2);// 运行eat方法Method happy = c1.getDeclaredMethod("happy",String.class);happy.setAccessible(true);// 设置禁止检查访问权限happy.invoke(user2,"张三");// 运行happy方法}
}

在这里插入图片描述

2. 注解

就是Java代码里的特殊标记,让其他程序根据注解信息来决定怎样执行该程序。注解本质是一个接口,Java中所有的注解都是继承Annotation接口的,@xxx注解(…)其实就是一个实现类,实现了该注解以及Annotation接口。

package zj;@interface ZJOne {int a();String b();boolean c() default true;
}
package zj;@ZJOne(a=12,b="23",c=false)
public class ZjStudy {@ZJOne(a=12,b="23")public void test(){}public static void main(String[] args) {}
}

2-1. 元注解

用于修饰注解的注解。有两个,分别为@Target、@Retention。其中@Target用于声明被修饰的注解只能在哪些位置上使用。
在这里插入图片描述
@Retention用于声明注解的保留周期
在这里插入图片描述

2-2. 解析注解

package zj;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.TYPE,ElementType.METHOD})
// 应用在类和方法上面
@Retention(RetentionPolicy.RUNTIME)
@interface ZJOne {int a();String b();boolean c() default true;
}
package zj;import java.lang.annotation.Annotation;
import java.lang.reflect.Method;@ZJOne(a=12,b="23",c=false)
class Demo{@ZJOne(a=21,b="嘻嘻哈哈")public void print(){}
}public class ZjStudy {public static void main(String[] args) throws Exception {Class c = Demo.class;ZJOne zjOne = (ZJOne) c.getDeclaredAnnotation(ZJOne.class);System.out.println(zjOne.a());System.out.println(zjOne.b());System.out.println(zjOne.c());// 获取在类上的注解数据Method print = c.getDeclaredMethod("print");ZJOne zjOne1 = print.getDeclaredAnnotation(ZJOne.class);System.out.println(zjOne1.a());System.out.println(zjOne1.b());System.out.println(zjOne1.c());// 获取方法上注解数据}
}

在这里插入图片描述

相关文章:

Java:反射、注解

文章目录 1. 反射1-1. 获取Class对象的三种方式1-2. 获取类的构造器、实例化对象1-3. 获取类的成员变量1-4. 获取类的成员方法 2. 注解2-1. 元注解2-2. 解析注解 1. 反射 反射:加载类,并允许以编程的方式解剖类中的各种成员变量、方法、构造器。 1-1. …...

Java 通过枚举类减少if else

目录 一. 案例1二. 案例2三. 案例3四. 案例4 枚举类聚合封装消息 一. 案例1 涉及到EnumMap的实际使用 ⏹定义一个枚举类,用来表示日本的各种支付方法对应的code import com.fasterxml.jackson.annotation.JsonFormat;// 让jackson将前台的数据封装数据到枚举类中 J…...

单链表---移除链表元素

对于无头单向不循环链表,给出头结点head与数值val,删除链表中数据值val的所有结点 #define ListNodeDataType val struct ListNode { struct ListNode* psll;ListNodeDataType val; } 方法一---遍历删除 移除所有数值为val的链表结点,…...

认识redis 及 Ubuntu安装redis

文章目录 一. redis概念二. redis应用场景二. redis的特性四. 使用Ubuntu安装redis 一. redis概念 redis 是在内存中存储数据的中间件, 用在分布式系统 redis是客户端服务器结构的程序, 客户端服务器之间通过网络来通信 二. redis应用场景 redis可用作数据库 类似MySQL, 但…...

Java开发网络安全常见问题

1、敏感信息明文传输 用户敏感信息如手机号、银行卡号、验证码等涉及个人隐私的敏感信息不通过任何加密直接明文传输。 如下图中小红书APP 的手机短信验证码登录接口,此处没有对用户手机号和验证码等信息进行加密传输,可以很简单的截取并开展一些合法的…...

C#基础之委托,事件

文章目录 1 委托1.1 简介1.2 操作使用1.2.1 声明委托(Delegate)1.2.2 实例化委托(Delegate)1.2.3 直接调用和invoke1.2.4 Invoke 和 BeginInvoke 1.3 委托的多播1.4 委托的匿名和lambda1.4.1 匿名方法1.4.2 lambda 表达式 1.5 内置…...

nginx配置静态资源的访问

比如静态资源图片位于/mnt/software/nginx/html/static/images目录下,那么nginx.conf中的配置则为: # 静态文件目录 location /static/images/ { root /mnt/software/nginx/html; try_files $uri $uri/ 404; #找不到时提示404 …...

JS的魔法三角:constructor、prototype与__proto__

在JavaScript中,constructor、prototype和__proto__是与对象创建和继承机制紧密相关的三个概念。理解它们之间的关系对于掌握JavaScript的面向对象编程至关重要。下面将详细介绍这个魔法三角: 1. constructor 定义:constructor是一个函数&am…...

CA系统(file.h---申请认证的处理)

#pragma once #ifndef FILEMANAGER_H #define FILEMANAGER_H #include <string> namespace F_ile {// 读取文件&#xff0c;返回文件内容bool readFilename(const std::string& filePath);bool readFilePubilcpath(const std::string& filePath);bool getNameFro…...

matlab显示sin二维图

1&#xff0c;新建脚本 2、保存脚本 3、脚本命令&#xff1a;clc 清除 脚本命令的信息 clrear all 清除全部 4工作区内容&#xff1a;变量啥的 x0:0.001:2*pi%% 开始 精度 中值 ysin(x) y1cos(x) figure%%产生一个屏幕 plot(x,y)%%打印坐标 title(ysin(x))%%标题 xlabel(…...

验证 kubelet 服务已经停止并且不再生成错误日志

要验证 kubelet 服务已经停止并且不再生成错误日志&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 检查 kubelet 服务状态 首先&#xff0c;确认 kubelet 服务已经停止。 Bash 深色版本 sudo systemctl status kubelet 你应该看到类似以下的输出&#xff0c;表示服…...

【Linux】进程控制-----进程替换

目录 一、为什么要进行进程替换&#xff1a; 二、进程替换的原理&#xff1a; 三、exec家族&#xff1a; 1、execl&#xff1a; 2、execlp&#xff1a; 3、execv&#xff1a; 4、execvp&#xff1a; 5、execle和execve ​编辑 putenv&#xff1a; 一、为什么要进行进程…...

安装SQL Server 2022提示需要Microsoft .NET Framework 4.7.2 或更高版本

安装SQL Server 2022提示需要Microsoft .NET Framework 4.7.2 或更高版本。 原因是&#xff1a;当前操作系统版本为Windows Server 2016 Standard版本&#xff0c;其自带的Microsoft .NET Framework 版本为4.6太低&#xff0c;不满足要求。 根据报错的提示&#xff0c;点击链接…...

使用ECharts创建带百分比标注的环形图

在数据可视化领域&#xff0c;环形图是一种非常有效的图表类型&#xff0c;它能够清晰地展示各部分与整体的关系。今天&#xff0c;我们将通过ECharts来创建一个带百分比标注的环形图&#xff0c;并详细解释如何实现这一效果。 1. 数据准备 首先&#xff0c;我们定义了一些基础…...

学习threejs,设置envMap环境贴图创建反光效果

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.CubeTextureLoader 立…...

go语言里的mkdir mkdirall有什么区别?

在Go语言中&#xff0c;os.Mkdir 和 os.MkdirAll 都是用来创建目录的函数&#xff0c;但它们之间存在一些关键的区别。 ### os.Mkdir - **功能**&#xff1a;os.Mkdir 用于创建一个单一的目录。如果该目录已经存在&#xff0c;则会返回一个错误。 - **参数**&#xff1a; - na…...

使用Python OpenCV实现图像形状检测

目录 一、环境准备 二、读取和预处理图像 读取图像 灰度化 滤波去噪 三、边缘检测 四、查找轮廓 五、绘制轮廓 六、形状分类 七、显示结果 八、完整代码示例 九、总结 图像形状检测是计算机视觉领域中的一项关键技术,广泛应用于工业自动化、机器人视觉、医学图像处…...

继上一篇,设置弹框次数以及自适应图片弹框,部分机型(vivo)老手机不显示的问题

上一篇写的本来测试好多型号都无事, 今天下午公司的战斗机vivo横空冒出… 晕 弹框直接显示都出不来了,现在还有用这种老的机型的,但是没办法咯~ 前端遇到这种兼容性的问题就要勇于解决 主要解决了这几点: // 添加图片加载事件 <imgv-if"imageUrl":src"image…...

基于RISC-V 的代理内核实验(使用ub虚拟机安装基本环境)

1.安装支撑软件 第一步&#xff0c;安装依赖库 RISC-V交叉编译器的执行仍然需要一些本地支撑软件包&#xff0c;可使用以下命令安装&#xff1a; $ sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bis…...

【MMKV】HarmonyOS中的优秀轻量化存储方式

MMKV 引言 在移动应用开发的世界里&#xff0c;数据存储和管理是至关重要的一环。随着技术的不断进步&#xff0c;开发者们对于高性能、轻量级、易用的数据存储解决方案的需求日益增长。MMKV&#xff08;Memory Mapped Key-Value&#xff09;正是这样一个开源的高性能key-val…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...