首页 > 其他分享 >反射的作用之动态对实例对象进行操作

反射的作用之动态对实例对象进行操作

时间:2023-06-03 17:33:23浏览次数:27  
标签:反射 Object list add 实例 报错 动态

    前提:我认为,反射概念在JavaSE内容中算是一个比较绕的知识点,反射本身好理解,但实际运用起来总会让人感觉好像又不是很对;对于反射的学习,我是先学具体使用再了解的作用,对于反射的作用之一,在这里做个笔记。

任务需求:对被Integer泛型约束的List集合,添加其他类型的元素

  一、必备知识

1、反射机制概念:对任何一个class类,在其运行时,都可以直接取得该Class对象和其全部成分;反射认为类中的每个成分都是单独的对象(符合Java的‘一切皆对象’概念),支持动态获取类信息以及动态调用类成分。

2、反射的“动态”:指越过编译阶段,可以直接对运行时Runtime阶段产生效果。

3、泛型:JDK5引入的一种特性,作用是在编译阶段约束数据类型并检查,只支持引用类型。

4、泛型标识和通配符:包括T、E、K、V等,和?;其实二者对代码的作用是一样的,区别只是给程序员一个提示,不同字母有对应的提示意义;后者相较更代表一切类型,当无法确定类型时使用;但是二者依然还是作符号作用,对应的类是Object。

5、在对Class具体成分进行操作时,要有实例对象,指定实例对象(成分不可能脱离实例单独存在,比如-- 我的身高体重,不可能脱离我实际存在)。

6、因为反射作用于运行阶段,所以报错只在运行时才会出现,并且报错提示也比较不友好哈。

  二、操作

  · 明了《一》的5点内容,操作步骤是简单的,重在理解 !具体代码如下:

1、直接添加非Integer内容 --- 【报错】

 //1、创建list集合实例
        List<Integer> list = new ArrayList<>();
        list.add(11);
        list.add(22);
//        list.add("aaa"); 报错

2、注意取到的Method add的第二个参数,'Object.class',作用(相当于反射的泛型,填了什么类型,通过反射添加就是什么类型,否则在运行阶段也会报错);要确保可以不止add一种类型数据,就要传参Object类(invoke传参受其限制)。

//2、使用运行阶段获取Class对象 方法
        Class c = list.getClass();
        //3、取Method对象(给集合添加数据的方法add)
        //add方法实际上的参数类型是不限的,所以使用泛型约束,确切定位时可以用Object类型,不影响使用
        Method add = c.getDeclaredMethod("add", Object.class);
        boolean flag = (boolean) add.invoke(list,"aaa");
        System.out.println(list);

【触发方法的传参和约定参数类型不一致,报错】

3、查看运行结果

    三、总结

  总结就是,要分清楚实例和类的区别,实例的成员的修改,类成员的获取。

 

标签:反射,Object,list,add,实例,报错,动态
From: https://www.cnblogs.com/ismohney-and-curlie/p/17454234.html

相关文章

  • 算法——动态规划(一)
    1、最长回文子串给你一个字符串 s,找到 s 中最长的回文子串。1publicclassSolution{2publicStringlongestPalindrome(Strings){3intlen=s.length();4booleandp[][]=newboolean[len][len];5intmaxlen=1;6in......
  • javassist动态生成类
    1. 使⽤javassist⽣成类   58来⾃百度百科:Javassist是⼀个开源的分析、编辑和创建Java字节码的类库。是由东京⼯业⼤学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加⼊了开放源代码JBoss 应⽤服务器项⽬,通过使⽤Javassist对字节码操作为JBoss实现动态"AO......
  • js 动态添加样式
    //添加css脚本exportconstloadStyle=url=>{constlink=document.createElement('link');link.type='text/css';link.rel='stylesheet';link.href=url;consthead=document.getElementsByTagName('head&......
  • 【花雕学AI】ChatGPT的四大语言处理神器:文本生成、问答、创意生成和内容优化的技巧和
    引言:ChatGPT是一个人工智能聊天机器人,它可以理解和交流多种语言,例如中文、英文、日文、西班牙语、法语、德语等。它是由OpenAI开发的,基于GPT-3.5和GPT-4这两个大型语言模型。它不仅可以与用户进行对话,还可以根据用户的指示完成一些语言处理的任务,例如文本生成、问答、创意生成和内......
  • Vue路由,子路由,动态路由,动态路由参数,路由查询参数
    一、路由、子路由、动态路由子路由、动态路由类似,不同的是子路由同时有路由跳转和页面跳转的,动态路由只有路由跳转,没有页面跳转举例如下:/customerHome 下有 item1 和 item2 两个子路由。import{createRouter,createMemoryHistory,RouteRecordRaw}from'vue-router'......
  • 计网:实验二 路由器动态路由的配置方法
     一、实验目的: 1.理解动态路由的工作原理;2.学习并掌握动态路由协议RIP的配置;3.学习并掌握动态路由协议OSPF的配置;4.进一步学习路由器的配置命令。二、实验原理:RIP:RoutingInformationProtocol,路由信息协议,是应用较早、使用较普遍的IGP内部网关协议,适用于小型同类网络,是典型......
  • 动态规划基础之矩阵取数问题 51nod1083
    题目地址:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1083题目:1083 矩阵取数问题基准时间限制:1 秒空间限制:131072 KB分值: 5 难度:1级算法题例如:3*3的方格。133213221......
  • 最大子矩阵和问题 动态规划 51nod1051
    1051 最大子矩阵和基准时间限制:2 秒空间限制:131072 KB分值: 40 难度:4级算法题例如:3*3的矩阵:-13-12-13-312和最大的子矩阵是:3-1-1312Input......
  • 【C语言】动态内存管理函数的 深度解析 #是不是对数组不能变大变小而烦恼呢?学会动态内
    前言动态内存管理函数可以说很好用,但是有些小危险。所谓动态内存分配,就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求......
  • Python中动态导入对象importlib.import_module()的使用
    参考:https://blog.csdn.net/edward_zcl/article/details/88809212https://www.cnblogs.com/yhjoker/p/15969508.html经常在项目中碰到需要根据配置动态导入不同的类的方法进行运行,这时就要用动态函数import_module的使用方法假设项目目录结构如下: ......