访问构造方法(反射)

文章目录

  • 前言
  • 一、反射是什么?
  • 二、访问构造方法
    • 1.Constructor对象的获取方法
    • 2.Constructor方法的使用
  • 总结

前言

        Java的反射机制可以实现访问、检测和修改Java对象本身信息的功能,在java.lang.reflect包下提供此功能。可以使程序员更加深入地控制程序的运行过程。可以理解为随时调用某个类的某个构造方法,成员方法,属性。


一、反射是什么?

        Java反射是指在运行时(Runtime)动态获取和操作一个类的信息的能力。通过Java反射,可以在运行时获取类的属性、方法、构造函数等信息,并且可以动态调用这些属性和方法。

        Java反射允许程序在运行时动态加载、探知和使用编译时未知的类,对象,方法等,可以实现动态生成对象,动态调用方法,动态修改属性等功能。使用Java反射,可以实现一些框架和库的功能,例如Spring框架中的依赖注入、Hibernate框架中的ORM映射等。 

二、访问构造方法 

        Constructor类就是java反射机制的java.lang包下的具体方法。 

        使用Constructor对象可以访问相应的构造方法。获取Constructor对象需要使用以下的方法,返回Constructor类型的对象或数组。

1.Constructor对象的获取方法

获取构造方法的方法
方法功能描述
getConstructors()获取所有公有的构造方法
getConstructor(Class<?>...parameterTypes)获取对应的公有的构造方法
getDeclaredConstructors()获取所有的构造方法
getDeclaredConstructor(Class<?>...parameterTypes)获取指定的构造方法(无论是否私有)

        获取所有的构造方法,具体的一个例子,想要使用Constructor对象随时调用某类的构造方法,先实例化一个该类的对象,然后使用getClass()方法将该对象包装为原始类型Class,最后使用以上的方法获取所有的构造方法。

        实操展示:

Example example = new Example();
Class<? extends Example> exampleClass =example.getClass();            
Constructor constructor[] = exampleClass.getDeclaredConstructors();
//该constructor数组获取了example类的全部构造方法

         获取指定的构造方法,操作与以上步骤一致,唯一不同点在getDeclaredConstructor()的括号中填入 数据类型.Class 

        实操展示:

Example example = new Example();
Class<? extends Example> exampleClass =example.getClass();            
Constructor constructor = 
exampleClass.getDeclaredConstructor(String.class,int.class,int.class);
//该constructor对象操纵的构造方法数据类型为 String,int,int

        或者为:

Example example = new Example();
Class<? extends Example> exampleClass =example.getClass();            
Constructor constructor = 
exampleClass.getDeclaredConstructor(new Class{}[String.class,int.class,int.class]);
//该constructor对象操纵的构造方法数据类型为 String,int,int

2.Constructor方法的使用

Constructor类的常用方法
方法功能描述
isVarArgs()查看该构造方法是否允许带有可变数量的参数,如果允许返回ture,否则返回false
getParameterTypes()按照声明顺序以Class数组的形式获取该构造方法的各个参数的类型
getExceptionTypes()以Class数组的形式获取该构造方法可能抛出的异常
newInstance(Object...initarges)通过该构造方法利用指定参数创建一个该类的对象,如果未设置参数则表示采用默认无参数的构造方法
setAccessible(boolean flag)如果该构造方法的权限为private,flag值为ture的话,可以无视该权限
getModifiers()获取可以解析出该构造方法所采用修饰符的整数(private=0,protected=1,public=2)

        实操展示:

        原想调用的方法:

public class Example {String name=null;int age=0;int id=0;public Example(){}@SuppressWarnings("unused")private Example(int id){this.id=id;}public Example(String name,int age,int id){this.name=name;this.age=age;this.id=id;}public Example(String...strings){if(strings.length>0){this.name=strings[0];}if(strings.length>1){this.age=Integer.valueOf(strings[1]);}if(strings.length>2){this.id=Integer.valueOf(strings[2]);}}public void input(){System.out.println("姓名:"+name+" 年龄:"+age+" id="+id);}
}

        该Example类有四个构造方法,将在下面的Demo类中,使用Constructor类的常用方法,逐一调用,并输出各个构造方法的信息。

import java.lang.reflect.Constructor;public class Demo{public static void main(String[] args) {Example person = new Example("张三", 18,101);Class<? extends Example> personC =person.getClass();@SuppressWarnings("rawtypes")Constructor[] declaredConstructors = personC.getDeclaredConstructors();for(int i=0;i<declaredConstructors.length;i++){Constructor<?> constructor = declaredConstructors[i];System.out.println("该类的名称:"+constructor.getName());//获取该构造方法的名称System.out.println("查看是否允许带有可变数量的参数:"+constructor.isVarArgs());//获取该构造方法的参数是否为可变的System.out.println("该构造方法的参数类型依次为:");@SuppressWarnings("rawtypes")Class type[]=constructor.getParameterTypes();if(type.length==0){System.out.println("该构造方法是无参的");}for(int j=0;j<type.length;j++){System.out.println(type[j]);}//获取该构造方法的参数类型System.out.println("该构造方法可能抛出的异常类型:");@SuppressWarnings("rawtypes")Class excpetion[]= constructor.getExceptionTypes();if(excpetion.length==0){System.out.println("无");}for(int j=0;j<excpetion.length;j++){System.out.println(excpetion[j]);}//获取该构造方法可能抛出的异常类型Example example =null;while (example==null) {try {if (i==0) {Object contect[] = new Object[]{new String[]{"王五","30","104"}};example=(Example)constructor.newInstance(contect);  //此方法所填值为object对象,newInstance方法不接受原始类型,例如String,需要封装成Object类}else if(i==1){example=(Example)constructor.newInstance("李四",20,102);}else if(i==2){example=(Example)constructor.newInstance(103);}else if (i==3) {example=(Example)constructor.newInstance();}   //实例化各个构造方法} catch (ClassCastException e) {e.printStackTrace();} catch (Exception e){//如果创建对象时异常,方法为私有,运行以下方法constructor.setAccessible(true);e.printStackTrace();}} if (example!=null) {example.input();}System.out.println("-------------------------------------");}}
}

        运行结果: 

        如上图当我们创建好一个该类的对象后,再转换为Constructor对象,就可以随时使用调用其newInstance()方法调用该类的构造方法,在代码运行的过程中实现动态调整数值。 

        补充:

Modifier类中的常用解析方法
静态方法功能描述
isPublic(int mod)查看是否被public修饰符修饰,如果是则返回true,否则返回false
isProtected(int mod)查看是否被protected修饰符修饰,如果是则返回true,否则返回false
isPrivate(int mod)查看是否被private修饰符修饰,如果是则返回true,否则返回false
isStatic(int mod)查看是否被static修饰符修饰,如果是则返回true,否则返回false
isFinal(int mod)查看是否被final修饰符修饰,如果是则返回true,否则返回false
toString(int mod)以字符串的形式返回所有修饰符

        举个例子说明如何使用。例子:判断contructor对象所代表的构造方法是否被final修饰符修饰,以及以字符串的形式获得该构造方法的所有修饰符的常写代码如下:

int modifiers = constructor.getModifiers();
//获取该constructor对象的构造方法的限制符整数值
boolean isEmbellishByPrivate = Modifier.isFinal(modifiers);
//是否被final修饰符修饰
String embellishment = Modifier.toString(modifiers);
//以字符串的形式获得该构造方法

总结

        以上就是今天要讲的内容,本文仅仅简单介绍了访问构造方法的使用,而反射提供了大量能使我们快速便捷地处理数据的函数和方法,指正的内容欢迎在评论区中留言。

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

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

相关文章

openflow协议抓包分析

1、准备实验拓扑&#xff1a; 在Mininet环境中创建一个简单的SDN拓扑&#xff0c;包括控制器、交换机、主机等。 确保拓扑能够正常运行&#xff0c;SDN交换机与控制器建立连接。 采用主机Ubuntu22.04主机&#xff0c;IP地址是192.168.87.130&#xff0c;安装opendaylight控制…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十二)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 19节&#xff09; P19《18.ArkUI组件-页面路由》 以访问京东页面为例&#xff0c;访问过的页面并没有消失&#xff0c;而是进入了…

三维大场景管理-3Dtiles规范

简介 &#xff1a; 这篇文章都是三年前写的了&#xff0c;一直在笔记库存中&#xff0c;今天把他放出来。主要是讲Cesium 的3Dtiles 格式&#xff0c;当然3Dtiles主要是解决场景管理大场景的LOD实现的问题&#xff0c;不管是剔除渲染性能优化之Culling 剔除或者 LOD 、3Dtiles…

吉林大学计科21级《软件工程》期末考试真题

文章目录 21级期末考试题一、单选题&#xff08;2分一个&#xff0c;十个题&#xff0c;一共20分&#xff09;二、问答题&#xff08;5分一个&#xff0c;六个题&#xff0c;一共30分&#xff09;三、分析题&#xff08;一个10分&#xff0c;一共2个&#xff0c;共20分&#xf…

基于tcp实现自定义应用层协议

认识协议 协议&#xff08;Protocol&#xff09; 是一种通信规则或标准&#xff0c;用于定义通信双方或多方之间如何交互和传输数据。在计算机网络和通信系统中&#xff0c;协议规定了通信实体之间信息交换的格式、顺序、定时以及有关同步等事宜的约定。简易来说协议就是通信…

Linux shell编程学习笔记50:who命令

0 前言 2024年的网络安全检查又开始了&#xff0c;对于使用基于Linux的国产电脑&#xff0c;我们可以编写一个脚本来收集系统的有关信息。比如&#xff0c;我们可以使用who命令来收集当前已登陆系统的用户信息&#xff0c;当前运行级别等信息。 1. who命令 的功能、格式和选项…

初级爬虫的总结一

初级爬虫的总结一之百度网页爬虫 一、寻找正确的sugrec二、url拼接出问题&#xff0c;解决办法 我遇到的问题&#xff1a; 1、没有找对网页sugrec&#xff0c;导致connect-type没有找对&#xff0c;以及一些小问题 2、url拼接时候出现乱码 一、寻找正确的sugrec 1、打开百度网…

【讲解下Web前端三大主流的框架】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

node.js学习P3-P10

P3 npm package.json&#xff08;package解读npm工具换镜像源&#xff09; 一个package.json文件可以的作用 作为一个描述文件&#xff0c;描述了你的项目依赖哪些包 &#xff0c;用来干什么的允许我们使用“语义版本规则”&#xff0c;指明你项目依赖的版本让你的构建更好的…

Web安全:SQL注入之时间盲注原理+步骤+实战操作

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

系统安全扫描扫出了:可能存在 CSRF 攻击怎么办

公司的H5在软件安全测试中被检查出可能存在 CSRF 攻击&#xff0c;网上找了一堆解决方法&#xff0c;最后用这种方式解决了。 1、问题描述 CSRF 是 Cross Site Request Forgery的缩写(也缩写为也就是在用户会话下对某个 CGI 做一些 GET/POST 的事&#xff0c;RIVTSTCNNARGO一这…

esp8266的rtos和nonos区别

https://bbs.espressif.com/viewtopic.php?t75242#p100294 https://blog.csdn.net/ydogg/article/details/72598752

存储方式 - 前端学习

1. cookie是什么&#xff1f;你了解cookie吗&#xff1f; 在计算机领域中&#xff0c;特指一种由服务器发送到用户浏览器并保存在用户计算机上的小型文本文件。这个文件可以被服务器用来识别用户身份、跟踪用户活动、保存用户设置等。它通常由名称、值、域名、路径、过期时间等…

【pm2 - sdk 集成到程序中,典型用法】

pm2作为一款进程管理神器&#xff0c;除了命令行的启动方式外&#xff0c;其还对应有sdk&#xff0c;集成到程序中&#xff0c;我们可以连接到已有或创建pm2的守护进程&#xff0c;与其进行交互&#xff0c;动态&#xff0c;编程式地控制程序的启停等。以下为示例&#xff1a; …

酷开科技大屏营销,多元需求唤醒“客厅经济”

随着科技的发展和消费者习惯的变化&#xff0c;OTT大屏营销正逐渐成为客厅经济的新风向。OTT不仅改变了人们获取信息和娱乐的方式&#xff0c;也为品牌营销提供了新的机遇和挑战&#xff0c;OTT大屏营销已经成为客厅经济的重要组成部分。酷开科技通过其自主研发的智能电视操作系…

PHP框架 Laravel

现在因为公司需求&#xff0c;需要新开一个Laravel框架的项目&#xff0c;毫无疑问&#xff0c;我又被借调过去了&#xff0c;最近老是被借调&#xff0c;有点阴郁&#xff0c;不过反观来看&#xff0c;这也是好事&#xff0c;又可以复习和巩固一下自己的知识点&#xff0c;接下…

数组基础-笔记

数组是非常基础的数据结构&#xff0c;实现运用和理解是两回事 数组是存放在连续内存空间上的相同类型的数据的集合 可以方便的通过下表索引的方式获取到下标下对应的数据。 举一个字符数组的例子&#xff1a; 注意两点&#xff1a; 数组下标从0开始 数组内存空间的地址是连…

yarn dev启动项目时遇到的问题

用yarn dev启动项目的时候&#xff0c;遇到了如下问题&#xff1a; 这个时候&#xff0c;我们可以这样解决&#xff1a;用nvm list 看下已安装的node版本&#xff0c;用nvm use切换一下node版本&#xff0c;当然前提是你已经安装了nvm。

C++: 二叉搜索树及实现

目录 一、二叉搜索树的概念 二、二叉搜索树的操作 2.1插入 2.2删除 1.有左子树&#xff0c;无右子树 2.有右子树&#xff0c;无左子树 3.有左子树和右子树 三、二叉搜索树的实现 要点 前言&#xff1a;为了学习map和set&#xff0c;需要先学二叉搜索树作为铺垫。 一、…

[论文笔记]Chain-of-Thought Prompting Elicits Reasoning in Large Language Models

引言 今天带来思维链论文 Chain-of-Thought Prompting Elicits Reasoning in Large Language Models的笔记。 作者探索了如何通过生成一系列中间推理步骤的思维链&#xff0c;显著提升大型语言模型在进行复杂推理时的能力。 1 总体介绍 语言模型的规模扩大已被证明能够带来…