Java反射学习记录

2023-10-26

一、反射概述

  • 反射允许程序在运行中获取类的内部信息,例如构造器、成员变量、成员方法等

  • 类加载之后,在堆中生成一个Class类的对象(一个类只有一个Class对象),这个对象包含类的完整结构信息

二、入门案例

通过配置文件中的内容生成指定类的对象并调用指定方法

// re.properties
className=com.javalearn.reflect.Cat
methodName=hi
public class Cat {
    private String name = "招财猫";

    public void hi() {
        System.out.println("hi:" + this.name);
    }
}
public class ReflectionDemo {

    public static void main(String[] args) throws Exception {
        // 1.properties对象加载配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("src/main/resources/re.properties"));
        String className = properties.getProperty("className");
        String methodName = properties.getProperty("methodName");
        System.out.println("类名:" + className);
        System.out.println("方法名:" + methodName);
        // 2.根据类名获取Class类对象
        //  获取Class对象的三种方式:
        //      1.类名.class
        //      2.对象.getClass()
        //      3.Class.forName(类名)
        Class cls = Class.forName(className);
        // 3.生成实例对象
        Object o = cls.newInstance();
        // 4.获取方法
        Method declaredMethod = cls.getDeclaredMethod(methodName);
        // 5.方法.invoke(对象)
        declaredMethod.invoke(o);
        // 6.反射涉及的其他类
        // 6.1Field成员变量
        Field name = cls.getDeclaredField("name");
        name.setAccessible(true);   //private属性需暴力反射
        System.out.println(name.get(o));
        // 6.2Constructor构造器
        Constructor constructor = cls.getConstructor(); //方法参数类型与构造器的参数类型一致,不写就是无参构造器
        Object o1 = constructor.newInstance();
        System.out.println(o1);
    }
}

三、反射原理图

Java程序执行的三个阶段

  • 将Java代码编译成字节码

  • 类加载器加载字节码文件,在堆中生成Class类对象

  • 运行阶段使用Class对象生成真正的Java类

反射可以做哪些事?

在运行时:

  • 判断任一对象所属的类

  • 构造任一类的对象

  • 得到任一类所具有的成员变量和方法

  • 调用任一对象的成员变量和方法

  • 生成动态代理

 四、反射性能测试

反射基本上是解释执行,性能差

public class PerformanceDemo {

    public static void main(String[] args) throws Exception {
        tradition();
        reflect();
    }

    private static void reflect() throws Exception {
        Class cls = Class.forName("com.sankuai.yangjin.javalearn.reflect.Cat");
        Object o = cls.newInstance();
        Method hi = cls.getMethod("hi");
        long start = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            hi.invoke(o);
        }
        long end = System.currentTimeMillis();
        System.out.println("反射耗时:" + (end - start));
    }

    private static void tradition() {
        Cat cat = new Cat();
        long start = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            cat.hi();
        }
        long end = System.currentTimeMillis();
        System.out.println("传统耗时:" + (end - start));
    }
}

优化方式:

Method、Field、Constructor对象都有setAccessible()方法,可以将参数设置为true,表示在使用反射时取消访问检查,效果也就一般般

五、Class类

  • Class类也是类,继承Obejct类

  • Class类对象不是new出来的,而是系统创建的

  • 对于某个类的Class类对象,在内存中只有一份,因为类只加载一次

  • 每个类的实例都知道自己是由哪个Class实例生成,对象.getClass()

  • 通过Class对象可以得到类的完整结构

  • Class对象是存放在堆的

  • 类的字节码二进制数据(元数据)存放在方法区,包括方法代码、变量名、方法名、访问权限等

六、类加载

反射是Java实现动态语言的关键,通过反射实现类动态加载

  • 静态加载:编译时加载相关的类,如果没有相关的类则报错,依赖太强

  • 动态加载:运行时加载需要的类,如果运行时不用该类,那么即使该类不存在也不报错

将下面一段代码通过javac 编译时,因为并没有Dog类,所以编译失败;但当前同样没有Person类,却不会由于没有Person类而导致编译失败,因为是动态加载,当出现case "2"时才会加载该类

public class LoadDemo {
    public static void main (String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in);
        String num = scanner.next();
        switch (num) {
            case "1":
                // 静态加载
                Dog dog = new Dog();
                break;
            case "2":
                // 反射,动态加载
                Class person = Class.forName("Person");
                break;
            default:
                
        }
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java反射学习记录 的相关文章

随机推荐

  • 过压保护芯片,IC电路方案集合

    随着快充适配器 QC3 0充电器 PD充电器的诞生 改变了原先USB的5V充电 增加了9V 12V的充电电压 甚至PD充电器20V也是很常见了 9V 12V 20V高电压的应用产生 虽然说9V 12V 20V的高压输出 不会被误触发 但是消
  • R-FCN+ResNet-50用自己的数据集训练模型(python版本)

    说明 本文假设你已经做好数据集 格式和VOC2007一致 并且Linux系统已经配置好caffe所需环境 博客里教程很多 下面是训练的一些修改 py R FCN源码下载地址 https github com Orpine py R FCN
  • react+antd+table实现表格数据,从头到尾循环、自动分页、滚动展示

    ts写法 分页是20 滚动过程中自动分页调接口返回数据 class Demo extends React Component
  • python调用resnet模型 对人脸图片进行特征提取,提取全连接层特征向量

    resnet feature extraction import os os chdir root caffe master examples import numpy as np import matplotlib pyplot as p
  • 汇编语言----mul指令

    mul指令 把操作数与AX相乘 最后存放在AX中 例子 mov ax 4 mov bx 5 mul bx ax 20
  • 动态设置src路径

    img class sidebar logo data return logo require assets dt logo png 如上动态设置图片的路径需要使用require 不然只能写上固定路径如下 img src assets dt
  • 排行榜|当 DB-Engines 遇见墨天轮国产数据库排行

    提到数据库排名 此时脑海里浮现出的是什么 是 DB Engines 还是墨天轮数据库排行 两者间有什么区别 下面来聊一下业内这两个知名数据库排名平台 本篇文章约有 3000 字 预计阅读时间 7 分钟 如阅读时间有限 请直接阅读文章末尾的对
  • 软件测试/测试开发丨容器编排K8S 下部署分布式UI自动化解决方案

    本文作者为霍格沃兹测试开发学社特约讲师乔巴 K8S目前是业界容器编排领域的事实标准 是几乎所有云原生架构的首选 目前随着云原生架构越来越流行 测试开发人员需要掌握K8S技术栈已经成为越来越迫切的需求 Kubernetes 开源于 2014
  • 敏捷开发-如何理解spring x

    2021年 不断思考一年 从领导风格转变让自己有点不适应 但是一直让自己谦卑心去学习每个人身上特长东西 接触过很多管理者 但是身上特点不足够明显的领导 我觉得不适合这个岗位 所以更多的调整心态去适应 找到每一个天 每个月 每一年战略目标自己
  • vc的编译过程

    对VC 工程编译过程的梳理 VC 的项目和解决方案文件解读 无非就是利用这些信息进行一个软件的编译 这些文件里面是存放的项目的配置和工程的组织 类似于makefile文件 但是只有VC 6 0的时候可以导出makefile文件 VC6的pr
  • python3 [爬虫入门实战]爬虫之scrapy爬取中国医学人才网

    自己第一次试着用scrapy进行爬取网页 总共爬下9240条数据 也就两分钟不到 400多页吧 用的比较简单 但是爬取成功后感觉成就感满满的 来张爬取结果图 爬取字段 hospitalName hospitalDesc hospitalSi
  • 【满分】【华为OD机试真题2023B卷 JS】乱序整数序列两数之和绝对值最小

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 乱序整数序列两数之和绝对值最小 知识点排序数组 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 给定一个随机的整数 可能存在正整数和负整数 数组 nums 请你在该数组
  • X11协议基础与实践

    X11协议基础与实践 概念 X11 X Window System 是一种位图显示的视窗系统 X表示X协议 11是协议版本号 X 协议主要由 X server 和 X client 组成 l X server 管理主机上与显示相关的硬件设置
  • 对角线遍历

    param number matrix return number var findDiagonalOrder function matrix if matrix null matrix length 0 return let m matr
  • “40道高频区块链面试题”——我的一些看法

    最近看到了一篇文章如下 超强攻略 40道高频区块链面试题大放送 年底跳槽看过来 地址我也贴出来吧 https mp weixin qq com s 3Fa2XG4R11QDfMSAaBCngw 哦 CSDN的地址也出来了 https blo
  • vscode好用的前端插件和快捷键

    用到好用的vscode插件 总结一下 文章目录 一 常用主题 1 Material Theme主题 2 Community Material Theme主题 3 vscode icons 二 基础插件 1 Code Spell checke
  • java生成二维码图片(有logo),并在图片下方附文字

    logo配置类 Created by Amber Wang on 2017 11 27 17 25 import java awt public class LogoConfig logo默认边框颜色 public static final
  • 【数据结构】 实现 堆 结构 ---超细致解析

    目录 二叉树的性质 二叉树的存储结构 顺序存储 链式存储 堆的概念和性质 堆的实现 堆的初始化 堆的插入 向上调整函数 堆的删除 向下调整函数 向上建堆 向下建堆 TopK问题 二叉树的性质 在我们实现堆之前我们要知道堆的实现是依靠的是二叉
  • C# Thread启动线程时传递参数

    目录 1 不带参数 使用ThreadStart 2 带一个参数 使用ParameterizedThreadStart 3 带多个参数 1 不带参数 使用ThreadStart private void funcName public voi
  • Java反射学习记录

    一 反射概述 反射允许程序在运行中获取类的内部信息 例如构造器 成员变量 成员方法等 类加载之后 在堆中生成一个Class类的对象 一个类只有一个Class对象 这个对象包含类的完整结构信息 二 入门案例 通过配置文件中的内容生成指定类的对