访问构造方法(反射)

文章目录

  • 前言
  • 一、反射是什么?
  • 二、访问构造方法
    • 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);
//以字符串的形式获得该构造方法

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

缓存降级

当Redis缓存出现问题或者无法正常工作时,需要有一种应对措施,避免直接访问数据库而导致整个系统瘫痪。缓存降级就是这样一种机制。 主要的缓存降级策略包括: 本地缓存降级 当Redis缓存不可用时,可以先尝试使用本地进程内缓存,如Guava Cache或Caffeine等。这样可以减少对Redis…

如何在工信部教考中心官网查询PG证书

1.第一步&#xff1a;进入工业和信息化部教育与考试中心官网 2.第二步&#xff1a;点击最右边“证书查询” 3.点击“工业和信息化部教育与考试中心培训评价证书查询” 4.在该页面按照如下方式进行证书查询&#xff1a;输入您的证件号码和您的证书号码以及姓名&#xff0c;点…

十四天学会Vue——Vue核心(理论+实战)中篇(第二天)

声明&#xff1a;是接着上篇讲的哦&#xff0c;感兴趣可以去看一看~ 这里一些代码就不写了&#xff0c;为了缩减代码量&#xff0c;大家知道就可以了&#xff1a; Vue.config.productionTip false //阻止 vue 在启动时生成生产提示。热身小tips&#xff0c;可以安装这个插件&…

免费wordpress中文主题

免费大图wordpress主题 首页是一张大图的免费wordpress主题模板。简洁实用&#xff0c;易上手。 https://www.jianzhanpress.com/?p5857 免费WP模板下载 顶部左侧导航条的免费WP模板&#xff0c;后台简洁&#xff0c;新手也可以下载使用。 https://www.jianzhanpress.com/…

idea改了代码,但是需要紧急切换分支,需要把改动的保存到本地

但是如果有冲突&#xff0c;你没有合并&#xff0c;那也会丢哦&#xff01; 改完那个分支&#xff0c;回到这个分支然后弹出来再。

WGCLOUD使用下发指令重启安卓设备

wgcloud的下发命令很好使&#xff0c;可以下发很多命令&#xff0c;最好的是可以选择很多主机同时下发命令 这里我想重启下我的安卓设备&#xff0c;只需要下发一个命令&#xff1a; bash reboot 就好啦 如下图

微信公众号完成自动回复,自定义菜单

微信公众号完成自动回复&#xff0c;自定义菜单 首先要获取到微信公众号的开发者权限&#xff0c;这一步省略&#xff0c;可以自行百度 微信公众号对接自己的服务器 首先第一步需要有自己的服务器和固定的ip&#xff0c; 其中&#xff0c;80/443端口需要有其中一个&#xff0…

按尺寸筛选轮廓图中的轮廓

1.按短边筛选 原始轮廓图&#xff1a; import cv2 import numpy as np# 读取轮廓图 contour_image cv2.imread(..\\IMGS\\pp_edge.png, cv2.IMREAD_GRAYSCALE)# 使用cv2.findContours()函数获取所有轮廓 contours, _ cv2.findContours(contour_image, cv2.RETR_EXTERNAL, cv2…

据阿谱尔APO Research调研显示,2023年全球绝缘栅双极晶体管(IGBT)市场销售额约为89.9亿美元

根据阿谱尔 (APO Research&#xff09;的统计及预测&#xff0c;2023年全球绝缘栅双极晶体管&#xff08;IGBT&#xff09;市场销售额约为89.9亿美元&#xff0c;预计在2024-2030年预测期内将以超过14.7%的CAGR&#xff08;年复合增长率&#xff09;增长。 由于各行业对电力电子…

XSKY CTO 在英特尔存储技术峰会的演讲:LLM 存储,架构至关重要

5 月 17 日&#xff0c;英特尔存储技术峰会在北京顺利举办。作为英特尔长期的合作伙伴&#xff0c;星辰天合受邀参加了此次峰会。星辰天合 CTO 王豪迈作为特邀嘉宾之一&#xff0c;作了主题为《LLM 存储&#xff1a;架构至关重要》的演讲&#xff0c;分享了大语言模型&#xff…

jmeter发送webserver请求和上传请求

有时候在项目中会遇到webserver接口和上传接口的请求&#xff0c;大致参考如下 一、发送webserver请求 先获取登录接口的token&#xff0c;再使用cookie管理器进行关联获取商品(webserver接口)&#xff0c;注意参数一般是写在消息体数据中&#xff0c;消息体有点像HTML格式 执…

Java整合EasyExcel实战——2 导出复杂表头

详情代码 实体类 Data public class ComplexHeadData {ExcelProperty({"主标题", "字符串标题"})private String string;ExcelProperty({"主标题", "日期标题"})private Date date;ExcelProperty({"主标题", "数字标…

(2024,DDDM,ODE,少量步生成,迭代生成)直接去噪扩散模型

Directly Denoising Diffusion Model 公众号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 直接去噪扩散模型 3.1. 迭代求解 4. Psuedo-LPIPS 指标 5. 实验 7. 讨论和局限性 0. 摘…

大模型时代的具身智能系列专题(二)

李飞飞团队 李飞飞是华人在AI领域最具影响力的学者之一&#xff0c;她是斯坦福大学人工智能实验室&#xff08;SAIL&#xff09;教授&#xff0c;美国国家工程院院士&#xff0c;知名CV数据集ImageNet的牵头人&#xff0c;斯坦福视觉与学习实验室&#xff08;SVL&#xff09;的…

2024.05.27学习记录

1、面经复习&#xff1a; 实际工作经验章节 2、代码随想录刷题&#xff1a;动态规划剩下部分和单调栈 3、rosebush 组件库完成Input 和 AutoComplete部分内容

长难句打卡5.27

In fact, allowing non-lawyers to own shares in law firms would reduce costs and improve services to customers, by encouraging law firms to use technology and to employ professional managers to focus on improving firms’efficiency. 事实上&#xff0c;这通过…

can设备调试 - linux driver

这篇文章主要介绍can设备的调试相关信息&#xff0c;不具体介绍驱动的实现。 如果驱动写完&#xff0c;对can设备进行验证&#xff0c;可能会出现很多不可预见的问题。下面说说验证步骤 验证can设备可以使用工具can-utils。这个工具包中会有cansend candump等程序。可以直接通…

视频监控技术前沿探索:智能化趋势与EasyCVR视频汇聚技术应用

在数字化时代的浪潮中&#xff0c;视频监控技术以其独特的优势&#xff0c;正在安防领域书写着新的篇章。它不仅为公共安全部门提供了强大的技术支持&#xff0c;还深入到教育、政府、娱乐、医疗、酒店、运动等多个领域&#xff0c;成为维护社会秩序、保障人民安全的重要工具。…

python爬虫学习(2)——requests模块

520那天我向心仪的女孩要微信&#xff1a;“女神&#xff0c;能给我你的微信号吗&#xff1f;” 女神&#xff1a;“给我——爬&#xff01;&#xff01;&#xff01;&#xff01;” 从那天开始&#xff0c;我就决定要学好爬虫&#xff0c;爬到女神微信号&#xff01;&#xff…

分布式锁的原理和实现(Go)

文章目录 为什么需要分布式锁&#xff1f;go语言分布式锁的实现Redis自己的实现红锁是什么别人的带红锁的实现 etcdzk的实现 面试问题什么是分布式锁&#xff1f;你用过分布式锁吗&#xff1f;你使用的分布式锁性能如何&#xff0c;可以优化吗&#xff1f;怎么用Redis来实现一个…