一文详解Java反射

文章目录

  • 反射是什么?
  • 反射的作用
  • 所有方法汇总
  • 一、加载Class对象
  • 二、加载类的构造器对象
  • 三、加载类的成员变量
  • 四、加载类的成员方法


反射是什么?

反射就是:加载类,并允许以编程的方式解剖类中的某个成分(成员变量,方法,构造器等)
反射需要学什么

  1. 反射第一步:加载类,获取类的字节码:Class对象
  2. 获取类的构造器:Constructor对象
  3. 获取类的成员变量:Field对象
  4. 获取类的成员方法:Method对象

在反射中,最重要的就是Class对象,之后的一切操作都是根据Class对象来操作的

反射的作用

  • 基本作用:可以得到一个类的全部成分然后操作

  • 可以破坏封装性

  • 适合做Java的框架,主流的框架会基于反射设计出一些通用的功能

一下测试代码我只提供了一个方法,需要源代码的在这里:反射代码

所有方法汇总

在这里插入图片描述

一、加载Class对象

获取Class对象的三种方法

  • Class c1 = 类名.class
  • 调用Class提供方法:public static Class forName(String Package);
  • Object提供的方法:public Class getClass(); Class c3 = 对象.getClass();
    /**
     * 测试三种方式得到的Class的三种方法
     * @throws ClassNotFoundException
     */
    @Test
    public void testEquals() throws ClassNotFoundException {
        Class s1 = Class.forName("com.wk.reflect.Student");
        Class s2 = Student.class;
        Student student = new Student();
        Class s3 = student.getClass();
        System.out.println(s1 == s2);   //true
        System.out.println(s2 == s3);   //true
        System.out.println(s1 == s3);   //true
    }

二、加载类的构造器对象

加载构造器对象的步骤:

  • 获取类的Class对象
  • 调用方法获得构造器对象
  • 使用:创建一个对象实例newInstance()

获取构造器的方法如下

方法说明
Constructor<?>[] getConstructors()获取全部构造器(只能获取public修饰)
Constructor<?>[] getDeclaredConstructors()获取全部构造器(任意修饰都可以拿到)
Constructor getConstructor(Class<?>… parameterTypes)获取某个构造器(只能能获取public修饰)
Constructor getDeclaredConstructor(Class<?>… parameterTypes)获取某个构造器(任意修饰都可以拿到)
Constructor提供的方法说明
T newInstance(Object… initargs调用此构造器对象表示的构造器,并传入参数,完成对象的初始化并返回
public void setAccessible(boolean flag)设置为True,表示禁止加内存访问控制(暴力反射)
    @Test
    public void testAll() throws Exception {
        //获得一个Class对象
        Class<Student> s1 = Student.class;
        //获取一个构造器
        //这里将无参构造器设置为private的,但是这个也可以获取
        Constructor<Student> constructor = s1.getDeclaredConstructor();  
        //无参构造器是private的,所以需要暴力反射
        constructor.setAccessible(true);   
        Student stu = constructor.newInstance();
        System.out.println(stu);
    }
--------------输出---------------
无参构造器执行...
Student{age=0, name='null'}

三、加载类的成员变量

加载成员变量对象的步骤:

  • 获取类的Class对象
  • 调用方法获得成员变量对象
  • 使用:调用成员变量对象的get()/set()方法

获取构成员变量的方法如下

方法说明
public Field[] getFields()获取类的全部成员变量(只能获取public修饰的)
public Field[] getDeclaredFields()获取类的全部成员变量(任意修饰都可以拿到)
public Field getField(String name)获取类的某个成员变量(只能获取public修饰的)
public Field getDeclaredField(String name)获取类的某个成员变量(任意修饰都可以拿到)
方法说明
void set(Object obj, Object value);赋值
Object get(Object obj)取值
public void setAccessible(boolean flag)设置为true,表示禁止检查访问控制(暴力反射)
    @Test
    public void testAllField() throws Exception {
        Class<Student> student = Student.class;
        //单个时输入变量名
        Field age = student.getDeclaredField("age");

        Student student1 = new Student();
        age.setAccessible(true);
        age.set(student1,18);
        System.out.println(student1);
    }
------------输出--------------
无参构造器执行...
Student{age=18, name='null'}

四、加载类的成员方法

加载成员方法对象的步骤:

  • 获取类的Class对象
  • 调用方法获得成员方法对象
  • 使用:调用成员方法对象的invoke()方法
方法
Method[] getMethods()获取类的全部成员变量(只能获取public修饰的)
Method[] getDeclaredMethods()获取类的全部成员变量(任意修饰都可以拿到)
Method getMethod(String name, Class<?>… parameterTypes)获取类的某个成员变量(只能获取public修饰的)
Method getDeclaredMethod(String name, Class<?>… parameterTypes)获取类的某个成员变量(任意修饰都可以拿到)
Mehode提供的方法说明
public Object invoke(Object obj, Object… args)触发某个对象的该方法执行
public void setAccessible(boolean flag)设置为true,表示禁止检查访问控制(暴力反射)
    @Test
    public void testAllMethod() throws Exception {
        Class<Animal> animal = Animal.class;
        //参数为方法的名称
        Method declaredMethod = animal.getDeclaredMethod("eat");
        declaredMethod.setAccessible(true);
        Animal animal1 = new Animal();
        Object invoke = declaredMethod.invoke(animal1);
        //返回值为null
        System.out.println(invoke);
    }
-----------输出--------------
动物吃
null

完结~

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

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

相关文章

ambari hive on Tez引擎一直卡住

hive on tez使用./bin/hive启动后一直卡住&#xff0c;无法进入命令行 使用TEZ作为Hive默认执行引擎时&#xff0c;需要在调用Hive CLI的时候启动YARN应用&#xff0c;预分配资源&#xff0c;这需要花一些时间&#xff0c;而使用MapReduce作为执行引擎时是在执行语句的时候才会…

微信小程序UI自动化测试实践:Minium+PageObject

小程序架构上分为渲染层和逻辑层&#xff0c;尽管各平台的运行环境十分相似&#xff0c;但是还是有些许的区别&#xff08;如下图&#xff09;&#xff0c;比如说JavaScript 语法和 API 支持不一致&#xff0c;WXSS 渲染表现也有不同&#xff0c;所以不论是手工测试&#xff0c…

Spingboot3详解(全网最详细,新建springboot项目并详解各种组件的用法)

一.Spring Initializr创建向导 1.新建一个空项目 2.在新创建的空项目里&#xff0c;新建Module 3. 选择Spring Initializr 4.选择Spring Boot的版本3以上 5.创建好的一个项目结构 controller包是自己创建的 6.项目结构分析 spingboot主程序 package com.example.boot;impor…

使用hutool工具生成非对称加密公私密钥以及使用案例

1.导入hutool依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.18</version></dependency>2.直接复制代码 package com.common.utils;import cn.hutool.core.codec.Base64; i…

mac苹果电脑清除数据软件CleanMyMac X4.16

在数字时代&#xff0c;保护个人隐私变得越来越重要。当我们出售个人使用的电脑&#xff0c;亦或者离职后需要上交电脑&#xff0c;都需要对存留在电脑的个人信息做彻底的清除。随着越来越多的人选择使用苹果电脑&#xff0c;很多人想要了解苹果电脑清除数据要怎样做才是最彻底…

优秀软件测试工程师必备的“8个能力”

首先要说&#xff0c;做软件测试不难&#xff0c;难的是做好软件测试。 结合自己这些年的工作经验&#xff0c;自己也总结出来8个方面的能力&#xff0c;可能有些方面感觉要求暂时还达不到&#xff0c;但这些确实是做软件测试工作所必备的能力&#xff0c;掌握了这8个方面的能力…

Python---time库

目录 时间获取 时间格式化 程序计时 time库包含三类函数&#xff1a; 时间获取&#xff1a;time() ctime() gmtime() 时间格式化&#xff1a;strtime() strptime() 程序计时&#xff1a;sleep() perf_counter() 下面逐一介绍&#…

【送书活动四期】被GitHub 要求强制开启 2FA 双重身份验证,我该怎么办?

记得是因为fork了OpenZeppelin/openzeppelin-contracts的项目&#xff0c;之后就被GitHub 要求强制开启 2FA 双重身份验证了&#xff0c;一拖再拖&#xff0c;再过几天帐户操作将受到限制了&#xff0c;只能去搞一下了 目录 2FA是什么为什么要开启 2FA 验证GitHub 欲在整个平台…

Html5响应式全开源网站建站源码系统 附带完整的搭建教程

Html5响应式全开源网站建站源码系统是基于Html5、CSS3和JavaScript等技术开发的全开源网站建站系统。它旨在为初学者和小型企业提供一套快速、简便的网站建设解决方案。该系统采用响应式设计&#xff0c;可以自适应不同设备的屏幕大小&#xff0c;提高用户体验。同时&#xff0…

柏林噪声C++

柏林噪声 随机噪声 如上图所示随机噪声没有任何规律可言&#xff0c;我们希望生成有一些意义的局部连续的随机图案 一维柏林噪声 假设希望生成一段局部连续的随机曲线&#xff0c;可以采用插值的方式&#xff1a;在固定点随机分配y值&#xff08;一般是整数点&#xff09;&a…

LeetCode力扣每日一题(Java):20、有效的括号

一、题目 二、解题思路 1、我的思路 我看到题目之后&#xff0c;想着这可能是力扣里唯一一道我能秒杀的题目了 于是一波操作猛如虎写出了如下代码 public boolean isValid(String s) {char[] c s.toCharArray();for(int i0;i<c.length;i){switch (c[i]){case (:if(c[i]…

Kotlin(十五) 高阶函数详解

高阶函数的定义 高阶函数和Lambda的关系是密不可分的。在之前的文章中&#xff0c;我们熟悉了Lambda编程的基础知识&#xff0c;并且掌握了一些与集合相关的函数式API的用法&#xff0c;如map、filter函数等。另外&#xff0c;我们也了解了Kotlin的标准函数&#xff0c;如run、…

Mybatis XML改查操作(结合上文)

"改"操作 先在UserInfoXMLMapper.xml 中 : <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><map…

2023金旗奖榜单隆重揭晓

2023年12月1日&#xff0c;2023品牌管理者年会暨第14届金旗奖品牌大赏圆满结束&#xff0c;为期两天的年会干货满满&#xff0c;四大专场八大主题演讲、两场圆桌论坛&#xff0c;汇集各领域大咖&#xff0c;巅峰交流品牌韧性增长之道&#xff0c;吸引来自海外内500多家企业品牌…

剪切板管理 Paste中文 for Mac

Paste是一个方便的剪贴板管理工具&#xff0c;它可以帮助你更好地组织、查找和管理剪贴板中的内容。它提供了历史记录、搜索、组织、格式处理和云同步等功能&#xff0c;使你能够更高效地使用剪贴板&#xff0c;并节省时间和精力。无论是在个人使用还是团队协作中&#xff0c;P…

学习git后,真正在项目中如何使用?

文章目录 前言下载和安装Git克隆远程仓库PyCharm链接本地Git创建分支修改项目工程并提交到本地仓库推送到远程仓库小结 前言 网上学习git的教程&#xff0c;甚至还有很多可视化很好的git教程&#xff0c;入门git也不是什么难事。但我发现&#xff0c;当我真的要从网上克隆一个…

图像的均方差和信噪比计算

图像的均方差和信噪比计算 一、均方差1、公式2、代码 二、信噪比1、公式2、代码 图像的均方差和信噪比公式及代码&#xff0c;代码基于opencv和C实现。 一、均方差 均方误差&#xff0c;英文简称&#xff1a;MSE&#xff0c;英文全称&#xff1a;“Mean Square Error”。 衡量…

相控阵天线(十五):进阶稀疏阵列天线(边缘稀疏阵列、稀疏子阵天线、旋转稀疏子阵天线)

目录 简介圆形边缘稀疏阵列矩形边缘稀疏阵列稀疏子阵天线旋转稀疏子阵天线 简介 前面的博客已经介绍过常见的平面阵有一些基本类型&#xff0c;本篇博客介绍一些实际工程中可能出现的阵列&#xff0c;包括椭圆阵列、子阵通过矩形拼接形成的矩形大阵列和圆形大阵列、子阵通过三…

CG-70A 双轴高精度倾角传感器准确测量水平角度的变化状况

产品概述 一款双轴高精度数字型&#xff08;RS485&#xff09;倾角传感器&#xff0c;其产品分辨率为0.0001&#xff0c;采用铝合金外壳&#xff0c;防护等级为IP67&#xff0c;可用来系统与准确地测量水平角度的变化状况。 功能特点 ★ 抗外界电磁干扰能力强、能承受大冲击…

Leetcode—198.打家劫舍【中等】

2023每日刷题&#xff08;五十二&#xff09; Leetcode—198.打家劫舍 算法思想 具体思路 首先&#xff0c;我们从上面的题目描述中抽象出题意。 ● 从一个非负整数数组中找到一个子序列&#xff0c;并且该子序列的和最大 ● 子序列中每个数的位置不能够相邻。举例来讲&…