当前位置: 首页 > 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…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...