Java反射详解(三)

上一篇博客:Java反射详解(二)

 写在前面:大家好!我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正,感谢大家的不吝赐教。我的唯一博客更新地址是:https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油,冲鸭!
用知识改变命运,用知识成就未来!加油 (ง •̀o•́)ง (ง •̀o•́)ง

文章目录

  • 前言
  • 创建对象
  • 构造器相关方法
    • getConstructors()
    • getDeclaredConstructors()
    • 其他几种方法
  • 类的声明信息
  • Class的类型信息
  • 反射与数组
  • 反射与枚举
  • 总结

前言

 之前两篇主要介绍了反射与 Class类 的关系以及通过 Class对象 我们可以获得什么信息以及可以做什么操作,还有如何通过反射获取 Class类 具体字段的信息以及具体方法的信息。本篇书接上文,继续进行梳理我们可以通过反射做什么。

创建对象

 通过 ClassnewInstance() 方法可以创建对象。这里需要注意该方法会调用类的默认的构造方法(即无参的 public 方法),如果我们操作的类没有无参构造方法,调用该方法会抛出 InstantiationException 异常。

public class TestClass {@Testpublic void test() throws IllegalAccessException, InstantiationException {Class<Person> personClass = Person.class;Person person = personClass.newInstance();person.eat(); // 生物进食}
}

构造器相关方法

getConstructors()

getConstructors() 获取当前运行时类中所有 public 构造方法。

public class TestClass {@Testpublic void test() {Class<Person> personClass = Person.class;Constructor<?>[] constructors = personClass.getConstructors();for (Constructor constructor : constructors) {System.out.println(constructor); // public ReflectionTest.Person()}}
}

getDeclaredConstructors()

 获取所有的构造器方法,包括 非public 的。

public class TestClass {@Testpublic void test() {Class<Person> personClass = Person.class;Constructor<?>[] constructors = personClass.getDeclaredConstructors();for (Constructor constructor : constructors) {System.out.println(constructor);/*** public ReflectionTest.Person()* private ReflectionTest.Person(java.lang.String,java.lang.String)*/}}
}

其他几种方法

Constructor类的方法如下,这里列举几个主要的方法:

  • public Constructor getConstructor(Class<?>… parameterTypes) 获取指定参数类型的public构造方法。
  • public Constructor getDeclaredConstructor(Class<?>… parameterTypes) 获取指定参数类型的构造方法,包括 非public 的。
  • public Class<?>[] getParameterTypes() 返回构造函数的参数类型数组。
  • public Annotation[] getAnnotations() 返回构造函数的注解
  • public void setAccessible(boolean flag) 设置构造器是否可访问
  • public T newInstance(Object … initargs) 通过构造器创建对象
  • public Class<?>[] getExceptionTypes() 返回构造方法声明抛出的异常类型
  • public int getModifiers() 返回构造器的修饰符

类的声明信息

Class还有很多方法可以获取类的声明信息,例如修饰符、父类、接口、注解等等,相关方法如下:

​​​​​​​​​​//获取修饰符,返回值可通过Modifier类进行解读
​​​​​​​​public native int getModifiers()
​​​​​​​​//获取父类,如果为Object,父类为null
​​​​​​​​public native Class<? super T> getSuperclass()
​​​​​​​​//对于类,为自己声明实现的所有接口,对于接口,为直接扩展的接口,不包括通过父类继承的
​​​​​​​​public native Class<? >[] getInterfaces();
​​​​​​​​//自己声明的注解
​​​​​​​​public Annotation[] getDeclaredAnnotations()
​​​​​​​​//所有的注解,包括继承得到的
​​​​​​​​public Annotation[] getAnnotations()
​​​​​​​​//获取或检查指定类型的注解,包括继承得到的
​​​​​​​​public <A extends Annotation> A getAnnotation(Class<A> annotationClass)
​​​​​​​​public boolean isAnnotationPresent(
​​​​​​​​                Class<? extends Annotation> annotationClass)​​

Class的类型信息

Class 代表的类型既可以是普通的类,也可以是内部类,还可以是基本类型、数组等等。可以通过一下方法检查 Class对象 的类型:

public native boolean isArray()  //是否是数组
​​​​​​​​public native boolean isPrimitive()  //是否是基本类型
​​​​​​​​public native boolean isInterface()  //是否是接口
​​​​​​​​public boolean isEnum()  //是否是枚举
​​​​​​​​public boolean isAnnotation()  //是否是注解
​​​​​​​​public boolean isAnonymousClass()  //是否是匿名内部类
​​​​​​​​public boolean isMemberClass()  //是否是成员类,成员类定义在方法外,不是匿名类
​​​​​​​​public boolean isLocalClass()  //是否是本地类,本地类定义在方法内,不是匿名类​​

反射与数组

Class类 中还导入了 java.lang.reflect 包中专门针对数组的 Array类,注意该类与 java.util.Arrays 不同。 java.lang.reflect 包中的 Array类 提供了对于数组的一些反射支持,主要方法如下:

​​​​​​​​​​//创建指定元素类型、指定长度的数组
​​​​​​​​public static Object newInstance(Class<? > componentType, int length)
​​​​​​​​//创建多维数组
​​​​​​​​public static Object newInstance(Class<? > componentType, int... dimensions)
​​​​​​​​//获取数组array指定的索引位置index处的值
​​​​​​​​public static native Object get(Object array, int index)
​​​​​​​​//修改数组array指定的索引位置index处的值为value
​​​​​​​​public static native void set(Object array, int index, Object value)
​​​​​​​​//返回数组的长度
​​​​​​​​public static native int getLength(Object array)
//除Object类型之外Array也支持以各种基本类型操作数组元素
​​public static native double getDouble(Object array, int index)
​​​​​​​​public static native void setDouble(Object array, int index, double d)
​​​​​​​​public static native void setLong(Object array, int index, long l)
​​​​​​​​public static native long getLong(Object array, int index)​​

反射与枚举

 对于枚举类型也有一个专门的方法用于获取所有的枚举常量。

public T[] getEnumConstants()

总结

 其实还有很多方法没有列举出来,但是通过这三篇博客的概述我们可以深刻的体会到了反射的强大机制。基本我们想获取的信息或者想实现的操作都能够通过反射进行获取或执行。以上提到的只是反射的一些基础知识,最重要的我们如何看懂那些框架对反射的运用以及在特殊情况下我们如何通过反射完成相关的需求。

 这里还是特别说明一下,我们在日常开发中基本用不到反射。虽然说反射可以让我们的代码更加灵活,但是这也是建立在特殊情况的前提之下的。使用反射也增加了安全问题(更容易出现运行时错误,使用显式的类和接口编译器还可以帮助我们做类型检查,减少错误。使用反射只能在运行时才知道);性能也相对差一些,之前看到过一些处理方式是将通过反射获取的信息存储到缓存或者数据库中。


  1. 《Java编程的逻辑》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/891510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用C#构建一个论文总结AI Agent

前言 我觉得将日常生活中一些简单重复的任务交给AI Agent&#xff0c;是学习构建AI Agent应用一个很不错的开始。本次分享我以日常生活中一个总结论文的简单任务出发进行说明&#xff0c;希望对大家了解AI Agent有所帮助。任务可以是多种多样的&#xff0c;真的帮助自己提升了…

vs 2022 中xml 粘贴为Class 中,序列化出来的xml 的使用

上图是visual studio 2022 中使用的粘贴功能的菜单位置 在生成的xml 中&#xff0c;有些是类似如下类型的 [System.Serializable] [System.Xml.Serialization.XmlType] public class Item {private bool isVisibleField;private bool isVisibleFieldSpecified;[System.Xml.Se…

代际超越:方太冰箱勾勒“蛙跳模型”轮廓

文&#xff1a;互联网江湖 作者&#xff1a;志刚 每一代人&#xff0c;都有其独特的新需求、新创造和新使命。 曾经的手机领域&#xff0c;苹果以其革命性创新颠覆了诺基亚的塞班系统&#xff0c;惊艳了整个行业。而如今&#xff0c;华为凭借其三折叠和自主研发的鸿蒙系统&am…

spring-boot启动源码分析(二)之SpringApplicationRunListener

在上一篇《spring-boot启动源码分析&#xff08;一&#xff09;之SpringApplication实例构造》后&#xff0c;继续看了一个月的Spring boot启动源码&#xff0c;初步把流程看完了&#xff0c;接下来会不断输出总结&#xff0c;以巩固这段时间的学习。同时也希望能帮到同样感兴趣…

Linux-Redis哨兵搭建

环境资源准备 主机名IP端口号角色vm1192.168.64.156379/26379mastervm2192.168.64.166379/26379slavevm3192.168.64.176379/26379slave 6379为redis服务暴露端口号、26379为sentinel暴露端口号。 安装Redis # 包文件下载 wget https://github.com/redis/redis/archive/7.2.2…

MySQL 03 章——基本的SELECT语句

一、SQL概述 &#xff08;1&#xff09;SQL背景知识 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是使用关系模型的数据库应用语言&#xff0c;与数据直接打交道不同的数据库管理系统生产厂商都支持SQL语句&#xff0c;但都有特有内容 …

[羊城杯 2024]1z_misc

得到FL4G.zip和天机不可泄露.txt文件&#xff0c;其中压缩包需要解压密码&#xff1a; 二十八星宿&#xff1a; 东方苍龙七宿&#xff1a;角、亢、氐、房、心、尾、箕 南方朱雀七宿&#xff1a;鬼、井、柳、星、张、翼、轸 西方白虎七宿&#xff1a;奎、娄、胃、昴、毕、觜、…

QT----------多媒体

实现思路 多媒体模块功能概述&#xff1a; QT 的多媒体模块提供了丰富的功能&#xff0c;包括音频播放、录制、视频播放和摄像头操作等。 播放音频&#xff1a; 使用 QMediaPlayer 播放完整的音频文件。使用 QSoundEffect 播放简短的音效文件。 录制音频&#xff1a; 使用 QMe…

云计算学习架构篇之HTTP协议、Nginx常用模块与Nginx服务实战

一.HTTP协议讲解 1.1rsync服务重构 bash 部署服务端: 1.安装服务 [rootbackup ~]# yum -y install rsync 2.配置服务 [rootbackup ~]# vim /etc/rsyncd.conf uid rsync gid rsync port 873 fake super yes use chroot no max connections 200 timeout 600 ignore erro…

《Vue3实战教程》42:Vue3TypeScript 与组合式 API

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 TypeScript 与组合式 API​ 这一章假设你已经阅读了搭配 TypeScript 使用 Vue 的概览。 为组件的 props 标注类型​ 使用 <script setup>​ 当使用 <script setup> 时&#xff0c;defineProps() 宏函数支…

Diffusion Transformer(DiT)——将扩散过程中的U-Net换成ViT:近频繁用于视频生成与机器人动作预测(含清华PAD详解)

前言 本文最开始属于此文《视频生成Sora的全面解析&#xff1a;从AI绘画、ViT到ViViT、TECO、DiT、VDT、NaViT等》 但考虑到DiT除了广泛应用于视频生成领域中&#xff0c;在机器人动作预测也被运用的越来越多&#xff0c;加之DiT确实是一个比较大的创新&#xff0c;影响力大&…

2024年12月 Scratch 图形化(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch图形化等级考试(1~4级)全部真题・点这里 一、单选题(共25题,共50分) 第 1 题 小猫初始位置和方向如下图所示,下面哪个选项能让小猫吃到老鼠?( ) A. B. C.

LLaMA详解

LLaMA 进化史 大规模语言模型(Large Language Model, LLM)的快速发展正在以前所未有的速度推动人工智能(AI)技术的进步。 作为这一领域的先行者, Meta在其LLaMA(Large Language Model Meta AI)系列模型上取得了一系列重大突破。 近日, Meta官方正式宣布推出LLaMA-3, 作为继LL…

SpringMVC(六)拦截器

目录 1.什么是拦截器 2.拦截器和过滤器有哪些区别 3.拦截器方法 4.单个拦截器的执行流程 5.使用拦截器实现用户登录权限验证&#xff08;实例&#xff09; 1.先在html目录下写一个login.html文件 2.在controller包下写一个LoginController文件 3.加拦截器 1.创建一个conf…

推理加速:投机采样经典方法

一 SpecInfer 基于模型 SpecInfer&#xff08;[2305.09781] SpecInfer: Accelerating Generative Large Language Model Serving with Tree-based Speculative Inference and Verification&#xff09; SpecInfer 投机采样利用多个小型模型&#xff08;SSM&#xff09;快速生…

最好用的图文识别OCR -- PaddleOCR(1) 快速集成

最近在项目中遇到了 OCR 的需求&#xff0c;希望能够实现高效而准确的文字识别。由于预算限制&#xff0c;我并未选择商业付费方案&#xff0c;而是优先尝试了开源工具。一开始&#xff0c;我测试了 GOT-OCR2.0&#xff0c;但由于我的 Mac 配置较低&#xff0c;不支持 GPU 运算…

FFmpeg:详细安装教程与环境配置指南

FFmpeg 部署完整教程 在本篇博客中&#xff0c;我们将详细介绍如何下载并安装 FFmpeg&#xff0c;并将其添加到系统的环境变量中&#xff0c;以便在终端或命令行工具中直接调用。无论你是新手还是有一定基础的用户&#xff0c;这篇教程都能帮助你轻松完成 FFmpeg 的部署。 一、…

Spring SpEL表达式由浅入深

标题 前言概述功能使用字面值对象属性和方法变量引用#this 和 #root变量获取类的类型调用对象(类)的方法调用类构造器类型转换运算符赋值运算符条件(关系)表达式三元表达式Elvis 操作符逻辑运算instanceof 和 正则表达式的匹配操作符 安全导航操作员数组集合(Array 、List、Map…

“AI人工智能软件开发公司:创新技术,引领未来

大家好&#xff01;今天我们来聊聊一个充满未来感的话题——AI人工智能软件开发公司。这个公司&#xff0c;用大白话说&#xff0c;就是专门研究和开发人工智能软件的地方&#xff0c;它们用最新的技术帮我们解决问题&#xff0c;让生活和工作变得更智能、更便捷。听起来是不是…

常见中间件漏洞复现

1.tomcat 1.1 CVE-2017-12615(put上传) 当在Tomcat的conf&#xff08;配置目录下&#xff09;/web.xml配置文件中添加readonly设置为false时&#xff0c;将导致该漏洞产 ⽣&#xff0c;&#xff08;需要允许put请求&#xff09; , 攻击者可以利⽤PUT方法通过精心构造的数据包…