干货分享之反射笔记

入门级笔记-反射

  • 一、利用反射破泛型集合
  • 二、Student类
  • 三、获取构造器的演示和使用
    • 1.getConstructors只能获取当前运行时类的被public修饰的构造器
    • 2.getDeclaredConstructors:获取运行时类的全部修饰符的构造器
    • 3.获取指定的构造器
      • 3.1得到空构造器
      • 3.2得到两个参数的有参构造器:
      • 3.3得到一个参数的有参构造器:并且是private修饰的
    • 4.有了构造器以后我就可以创建对象
  • 四、获取属性的演示和使用:
    • 1.getFields:获取运行时类和父类中被public修饰的属性
    • 2.getDeclaredFields:获取运行时类中的所有属性
    • 3.获取指定的属性:
    • 4.属性的具体结构
      • 4.1获取修饰符
      • 4.2获取属性的数据类型:
      • 4.3获取属性的名字:
      • 4.4给属性赋值:(给属性设置值,必须要有对象)
  • 五、获取方法的演示与应用
    • 1.getMethods:获取运行时类的方法还有所有父类中的方法(被public修饰)
    • 2.getDeclaredMethods:获取运行时类中的所有方法:常用!!!!!
    • 3.获取指定的方法:
    • 4.调用方法:
  • 六、获取运行时类的接口
  • 总结


一、利用反射破泛型集合

public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //用反射来破泛型集合
        /**
         * 泛型集合:限制存入集合中的变量类型
         * 但是这种限制,只出现在编码/编译期。
         * 运行期是没有泛型;反射,恰好就是在运行期执行
         */
        ArrayList<String> list = new ArrayList<>();
        list.add("123");

        Class cls = ArrayList.class;
        Method add = cls.getMethod("add", Object.class);
        add.invoke(list,34);
        add.invoke(list,false);

        System.out.println(list);

        //运行期无泛型
    }

运行结果:
在这里插入图片描述



二、Student类

public class Student extends Person implements MyInterface {

    private int sno;//学号
    double height;//身高
    protected double weight;//体重
    public double score;//成绩
    public String banji;

    public String showInfo(){
        return "我是一名三好学生";
    }
    public String showInfo(int a,int b){
        return "重载方法====我是一名三好学生";
    }
    private void work(){
        System.out.println("我以后会找工作-->成为码农 程序员 程序猿 程序媛");
    }
    void happy(){
        System.out.println("做人最重要的就是开心每一天");
    }
    protected int getSno(){
        return sno;
    }

    @Override
    public void myMethod() {
        System.out.println("我重写了myMethod方法。。");
    }

    public Student() {
    }

    public Student(int sno) {
        this.sno = sno;
    }

    public Student(int sno, double weight) {
        this.sno = sno;
        this.weight = weight;
    }

    private Student(double height) {
        this.height = height;
    }

    public Student(int sno, double height, double weight, double score) {
        this.sno = sno;
        this.height = height;
        this.weight = weight;
        this.score = score;
    }

    @Override
    public String toString() {
        return "Student{" +
                "sno=" + sno +
                ", height=" + height +
                ", weight=" + weight +
                ", score=" + score +
                '}';
    }
}


三、获取构造器的演示和使用

//获取字节码信息:
        Class cls = Student.class;
        //通过字节码信息可以获取构造器:

1.getConstructors只能获取当前运行时类的被public修饰的构造器

代码如下(示例):

Constructor[] c1 = cls.getConstructors();
        for(Constructor c:c1){
            System.out.println(c);
        }

运行结果:
在这里插入图片描述

2.getDeclaredConstructors:获取运行时类的全部修饰符的构造器

代码如下(示例):

Constructor[] c2 = cls.getDeclaredConstructors();
        for(Constructor c:c2){
            System.out.println(c);
        }

运行结果:
在这里插入图片描述

3.获取指定的构造器

3.1得到空构造器

Constructor con1 = cls.getConstructor();
        System.out.println(con1);

运行结果:
在这里插入图片描述

3.2得到两个参数的有参构造器:

Constructor con2 = cls.getConstructor(int.class, double.class);
        System.out.println(con2);

运行结果:
在这里插入图片描述

3.3得到一个参数的有参构造器:并且是private修饰的

Constructor con3 = cls.getDeclaredConstructor(int.class);
        System.out.println(con3);

运行结果:
在这里插入图片描述

4.有了构造器以后我就可以创建对象

Object o1 = con1.newInstance();
        System.out.println(o1);
        Object o2 = con2.newInstance(180120111, 170.6);
        System.out.println(o2);

运行结果:
在这里插入图片描述



四、获取属性的演示和使用:

//获取字节码信息
        Class cls = Student.class;

1.getFields:获取运行时类和父类中被public修饰的属性

Field[] fields = cls.getFields();
        for(Field f:fields){
            System.out.println(f);
        }

运行结果:
在这里插入图片描述

2.getDeclaredFields:获取运行时类中的所有属性

Field[] declaredFields = cls.getDeclaredFields();
        for(Field f:declaredFields){
            System.out.println(f);
        }

运行结果:
在这里插入图片描述

3.获取指定的属性:

Field score = cls.getField("score");
        System.out.println(score);
        Field sno = cls.getDeclaredField("sno");
        System.out.println(sno);

运行结果:
在这里插入图片描述

4.属性的具体结构

4.1获取修饰符

//获取指定的属性:
        Field score = cls.getField("score");
        System.out.println(score);
        Field sno = cls.getDeclaredField("sno");
        System.out.println(sno);
        System.out.println("---------------------");
//        //属性的具体结构:
//        //获取修饰符
        /*int modifiers = sno.getModifiers();
        System.out.println(modifiers);
        System.out.println(Modifier.toString(modifiers));*/
        System.out.println(Modifier.toString(sno.getModifiers()));

运行结果:
在这里插入图片描述
这里先要获取到一个属性,再去获取属性的修饰符

4.2获取属性的数据类型:

Class clazz = sno.getType();
        System.out.println(clazz.getName());
        System.out.println("---------------------");

运行结果:
在这里插入图片描述
这里要接着上面的写

4.3获取属性的名字:

String name = sno.getName();
        System.out.println(name);
        System.out.println("-------------------------------");

运行结果:
在这里插入图片描述

4.4给属性赋值:(给属性设置值,必须要有对象)

Field sco = cls.getField("score");
        Object obj = cls.newInstance();
        sco.set(obj,98);
        //给obj这个对象的score属性设置具体的值,这个值为98
        System.out.println(obj);

运行结果:
在这里插入图片描述



五、获取方法的演示与应用

//获取字节码信息
        Class cls = Student.class;

1.getMethods:获取运行时类的方法还有所有父类中的方法(被public修饰)

Method[] methods = cls.getMethods();
        for(Method m:methods){
            System.out.println(m);
        }
        System.out.println("-----------------------");

运行结果:
在这里插入图片描述

2.getDeclaredMethods:获取运行时类中的所有方法:常用!!!!!

Method[] declaredMethods = cls.getDeclaredMethods();
        for(Method m:declaredMethods){
            System.out.println(m);
        }
        System.out.println("-----------------------");

运行结果:
在这里插入图片描述

3.获取指定的方法:

Method showInfo1 = cls.getMethod("showInfo");
        System.out.println(showInfo1);
        Method showInfo2 = cls.getMethod("showInfo", int.class, int.class);
        System.out.println(showInfo2);
        Method work = cls.getDeclaredMethod("work");
        work.setAccessible(true);//!!!这里是个重点暴力破拆私有--调用.setAccessible方法
        System.out.println(work);
        System.out.println("-----------------------");

运行结果:
在这里插入图片描述

4.调用方法:

 Object o = cls.newInstance();
        myMethod.invoke(o);//调用o对象的mymethod方法
        work.invoke(o);//调用o对象的work方法

运行结果:
在这里插入图片描述



六、获取运行时类的接口

 public static void main(String[] args) {
        //获取字节码信息:
        Class cls = Student.class;
        //获取运行时类的接口:
        Class[] interfaces = cls.getInterfaces();
        for(Class c:interfaces){
            System.out.println(c);
        }

        //得到父类的接口:
        //先得到父类的字节码信息:
        Class superclass = cls.getSuperclass();

        //得到接口:
        Class[] interfaces1 = superclass.getInterfaces();
        for(Class c:interfaces1){
            System.out.println(c);
        }

        //获取运行时类所在的包:
        Package aPackage = cls.getPackage();
        System.out.println(aPackage);
        System.out.println(aPackage.getName());

        //获取运行类的注解:
        Annotation[] annotations = cls.getAnnotations();
        for(Annotation a:annotations){
            System.out.println(a);
        }
    }

运行结果:
在这里插入图片描述


总结

以上就是今天要分享的内容,干货满满,其中有一个重点!在获取指定的私有方法时候,暴力破拆私有的权限,要不然后面调用这个方法会报错,利用.setAccessible(true)方法实现,看完了的话点个收藏吧,防止用的时候找不到。

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

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

相关文章

【项目技术介绍篇】如何从码云gitee下载项目代码

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

用 C++ 编码架构图的最佳用例

统一建模语言&#xff08;UML&#xff09;&#xff0c;作为一种实际应用的语言标准&#xff0c;借助一系列架构图呈现建模软件系统。UML 的出现鼓励了自动化软件工具的开发&#xff0c;有助于自动代码生成。UML 图面向对象系统和软件工具&#xff0c;将静态结构和动态行为以可视…

python---协程与任务详解

文章目录 前言一. 基本概念了解与学习1.1 阻塞1.2 非阻塞1.3 同步1.4 异步1.5 多进程1.6 协程 二. 示例操作对比2.1 同步调用2.2 多进程2.3 异步IO 三. 异步协程3.1 定义协程3.2 多任务协程3.3 协程实现3.4 使用 aiohttp3.5 与多进程结合 总结 前言 之前爬虫使用的是requests多…

Docker 【安装MongoDB】

文章目录 前言一、安装二、使用1. 通过权限认证的方式登入2. 基础操作 前言 MongoDB是一个非关系型数据库&#xff0c;它主要的应用场景有这些 相比mysql&#xff0c;MongoDB没有事务&#xff0c;索引之类的东西。最小单位是文档。 可能有人说&#xff0c;为什么这个场景我要…

latex在写算法`\For` 和 `\EndFor` 以及 `FOR` 和 `\ENDFOR` ,报错Undefined control sequence.

这里写目录标题 1. 错误原因2. 进行改正3. 爱思唯尔期刊与施普林格期刊对于算法的格式不太一样&#xff0c;不能直接套用总结 1. 错误原因 我在算法中使用\For&#xff0c;\EndFor 2. 进行改正 换成FOR&#xff0c;\ENDFOR 3. 爱思唯尔期刊与施普林格期刊对于算法的格式不太…

CopyOnWriteArrayList原理

CopyOnWriteArrayList原理 1. 简介 在 ArrayList 的类注释上&#xff0c;JDK 就提醒了我们&#xff0c;如果要把 ArrayList 作为共享变量的话&#xff0c;是线程不安全的&#xff0c;推荐我们自己加锁或者使用 Collections.synchronizedList 方法&#xff0c;其实 JDK 还提供…

【解决】E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend)

常用两个方法 1 杀死之前的相关进程 在提示信息里面有进程号 $ sudo kill 2158 2 强制解锁 sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock 以上不行时候&#xff0c;更新软件库 sudo apt-get update

锁车锁电曝视频+画像车主:车企的「科技与狠活」

作者 | 辰纹 来源 | 洞见新研社 近日&#xff0c;不少车企远程锁车锁电再度引热议。但车企的“科技狠活”没有最狠只有更狠&#xff0c;仅去年就发生数宗车企泄露车主视频等隐私数据的案例&#xff0c;不仅令当事车主“社死”&#xff0c;甚至成千上万网友发问“自己的车&…

2024中国闪存市场观察:AI助推闪存全面起势?

过去两年&#xff0c;闪存市场一直处于低迷状态&#xff0c;但去年第四季度闪存颗粒资源的上涨&#xff0c;导致闪存产品价格一路上扬&#xff0c;市场遂发生反转。 2024年&#xff0c;中国闪存市场会彻底走向复苏&#xff0c;还是急转直下&#xff1f;中国AI热潮&#xff0c;…

如何撰写高质量渗透测试报告

渗透测试作为信息安全领域的重要环节&#xff0c;其成果的体现形式往往凝聚在最终的渗透测试报告之中。一份优秀的渗透测试报告不仅记录了测试过程的每一个细节&#xff0c;更是指导客户改进安全状况、防范潜在风险的重要依据。下面&#xff0c;我们将深入探讨如何撰写一份详尽…

【最新!红外小目标检测算法HCFNet】

文章目录 摘要1 引言2 相关工作2.1 传统方法2.2 深度学习方法 3 方法3.1 PPA3.2 维度感知选择性整合模块3.3 多稀释通道细化器模块3.4 损失函数设计 4 实验4.1 数据集与评估指标4.2 实现细节4.3 消融和对比 5 结论 论文&#xff1a;HCF-Net: Hierarchical Context Fusion Netwo…

Python篇之网络编程,实现简单的服务端和客户端的内容传输

本小节内容&#xff1a;实现简单的信息交流 文章目录 一、 Socket介绍二、客户端与服务端三、在python中实现网络通信1. 服务端2. 客户端3. 连接测试 一、 Socket介绍 socket (简称 套接字) 模块是其内置的标准库之一&#xff0c;它实现了BSD sockets API&#xff0c;允许开发…

FreeRTOS使用记录

FreeRTOS使用记录 移植STM32F104ZGT6main.c 增加us延时 移植 STM32F104ZGT6 FreeRTOSConfig.h #ifndef FREERTOS_CONFIG_H #define FREERTOS_CONFIG_H/*-----------------------------------------------------------* Application specific definitions.** These definition…

ES 进阶知识

索引Index 一个索引就是一个拥有几分相似特征的文档的集合。比如说&#xff0c;你可以有一个客户数据的索引&#xff0c;另一个产品目录的索引&#xff0c;还有一个订单数据的索引。一个索引由一个名字来标识&#xff08;必须全部是小写字母&#xff09;&#xff0c;并且当我们…

C++ STL - 优先级队列及其模拟实现

目录 0. 引言 1. priority_queue 介绍 1.1 构造函数 1.2 priority_queue 接口函数使用 1.3 仿函数 1.4 题目练习 2. priority_queue 模拟实现 2.1基本框架&#xff1a; 2.2 默认构造函数 2.3 基本函数 2.4 堆的向上以及向下调整 0. 引言 优先队列 (priority_queu…

【测试开发学习历程】认识Python + 安装Python

目录 1 认识 Python 1.1 Python 的起源 1.2 Python的组成 1.2.1 解释器 1.1.2 Python 的设计目标 1.1.3 Python 的设计哲学 1.2 为什么选择 Python 测试人员选择Python的理由 1.3 Python 特点 面向对象的思维方式 1.4 Python 的优缺点 1.4.1 优点 1.4.2 缺点 3. 安…

Unity编辑器功能将AB资源文件生成MD5码

将路径Application.dataPath/ArtRes/AB/PC文件夹下所有的Ab包文件生成MD5吗&#xff0c;通过文件名 文件长度MD5‘|’的格式拼接成字符串写入到资源对比文件abCompareInfo.txt中。 将路径pathFile扥文件生成MD5码

vue项目在本地源码方式启动和打包之后在nginx中代理有什么不同

Vue项目在本地源码方式启动和打包之后在Nginx中代理的主要区别在于开发环境与生产环境的配置、性能优化、安全性和部署流程等方面。以下是一些具体的差异点&#xff1a; 开发环境与生产环境&#xff1a; 本地源码启动通常是在开发环境中&#xff0c;使用Vue CLI的vue-cli-servi…

关于在forEach循环中使用异步,造成forEach里面的函数还未执行完毕,外层的同步已经被执行的问题

使用 原生的 for循环替代forEach循环即可解决问题 1.实例代码&#xff1a; select_Father_comment_sql_res.forEach( (item) > {const Select_FId_children_sql util.format("Select *, \IFNULL(User.UserName,) as CommentUserName, \IFNULL(User.UserName,) as AtU…

【王道训练营】第3题 判断某个年份是不是闰年,如果是闰年,请输出“yes”,否则请输出“no”

文章目录 引言闰年初始代码代码改进改进1&#xff1a;添加提示信息改进2&#xff1a;代码格式改进3&#xff1a;变量命名 其他实现方式使用if-else语句使用函数使用三元操作符 结论 引言 在公历中&#xff0c;闰年的规则如下&#xff1a;如果某个年份能被4整除但不能被100整除…