反射的概念 和基本使用(一)

反射一、反射的基本概念 Java程序在编写完成之后,为了能够运行,首先会被编译为class文件。然后,在Java程序的运行过程当中,每当需要一个新的类,就需要将其对应的class文件加载到JVM虚拟机当中。加载class文件的叫作ClassLoader。 JDK具有多个层次的ClassLoader,最根上的那个叫作BootStrap ClassLoader,负责加载JDK中最核心的类。BootStrap ClassLo... 阅读详情

Python微信订餐小程序课程视频

https://edu.youkuaiyun.com/course/detail/36074

Python实战量化交易理财系统

https://edu.youkuaiyun.com/course/detail/35475

1 反射

什么是反射

java反射 是指在运行状态中 对于任意一个类 我们都可以知到这个类的所有方法和属性 也可以调用其所有的方法和属性 这种动态获取的方式 我们称为 反射

什么是class对象

我们通过使用反射 就是通过Class类来实现的 Class 类的实例表示正在运行的 Java 应用程序中的类和接口。

也就是jvm中有N多的实例每个类都有该Class对象。(包括基本数据类型)

反射的使用

获取class对象的三种方式
基本类

java

/**
 *
 * @author : look-word
 * @date : 2022-04-05 20:49
 **/
public class Student {
    private String username;
    private String gender;

    public String getInfo() {
        this.setUsername("张三");
        this.setGender("男");
        return this.username+"="+this.gender;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}
测试代码如下

java

/**
 * @author : look-word
 * @date : 2022-04-05 20:54
 **/
public class Test {
    public static void main(String[] args) {

        /*
 1 创建对象 获取其class对象
 */
        Student student = new Student();
        Class extends Student aClass = student.getClass();
        System.out.println(aClass.getSimpleName());
        /*
 2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
 */
        Class extends Student bClass=Student.class;
        System.out.println(aClass == bClass?"两者是同一对象":"两者不是同一对象");
        /*
 3 通过Class类的forName方法获取
 */
        try {
            // Class.forName(类的相对路径)
            Class cClass = Class.forName("bean.Student");
            System.out.println(bClass == cClass?"两者是同一对象":"两者不是同一对象");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
结果如下

证明

在运行期间 一个类只有一个class对象的产生

常用的是第三次 清晰 明了 因为 在一个项目中 可能会产生 相同名字的类

解决疑惑 为什么要是用 第三种

第一种对象都有了还要反射干什么。

第二种需要导入类的包,依赖太强,不导包就抛编译错误。

第三种,一个字符串可以传入也可写在配置文件中等多种方法。

获取Class类中的所有构造方法
基本类

java

public class Student {
    //---------------构造方法-------------------
    //(默认的构造方法)
    Student(String str){
        System.out.println("(默认)的构造方法 s = " + str);
    }

    //无参构造方法
    public Student(){
        System.out.println("调用了公有、无参构造方法执行了。。。");
    }

    //有一个参数的构造方法
    public Student(char name){
        System.out.println("姓名:" + name);
    }

    //有多个参数的构造方法
    public Student(String name ,int age){
        System.out.println("姓名:"+name+" 年龄:"+ age);//这的执行效率有问题,以后解决。
    }

    //受保护的构造方法
    protected Student(boolean n){
        System.out.println("受保护的构造方法 n = " + n);
    }

    //私有构造方法
    private Student(int age){
        System.out.println("私有的构造方法 年龄:"+ age);
    }
}
测试代码

java

/**
 * 测试构造方法
 * @author : look-word
 * @date : 2022-04-05 21:18
 **/
public class TestConstructor {

/**
 * 通过Class对象可以获取某个类中的:构造方法、成员变量、成员方法;并访问成员;
 *
 * 1.获取构造方法:
 * 1).批量的方法:
 * public Constructor[] getConstructors():所有"公有的"构造方法
 public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)

 * 2).获取单个的方法,并调用:
 * public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法:
 * public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;
 *
 * 调用构造方法:
 * Constructor-->newInstance(Object... initargs)
*/
    public static void main(String[] args) throws Exception {
        Class student = Class.forName("bean.Student");
        /*
 1 获取所有共有的构造方法
 */
        System.out.println("\n1 获取所有共有的构造方法");
        Constructor[] constructors = student.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }

        /*
 2 获取共有的无参构造方法 可以写 null 或者 不填
 */
        System.out.println("\n2 获取共有的无参构造方法 可以写 null 或者 不填");
        Constructor constructor2 = student.getConstructor();
        constructor2.newInstance();

        /*
 3 获取 给定参数共有的构造方法 public bean.Student(java.lang.String,int)
 */
        System.out.println("\n 3 获取 给定参数共有的构造方法 public bean.Student(java.lang.String,int)");
        Constructor constructor3 = student.getConstructor(String.class, int.class);
        constructor3.newInstance("张三",19);

        /*
 4 获取 私有给定参数的构造方法 私有 不给定参数 不传参数即可
 */
        Constructor constructor4 = student.getDeclaredConstructor(int.class);
        /*
 获取私有的属性 或者构造方法是 需要 设置无障碍 俗称 暴力访问
 不设置 会出异常 java.lang.IllegalAccessException
 */
        constructor4.setAccessible(true);
        constructor4.newInstance(19);
    }
}

执行结果

注意

获取私有属性的时候 一定要设置无障碍

setAccessible(true);

不设置 会出异常 java.lang.IllegalAccessException

newInstance(Object… initargs) 创建一个新实例
使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。

每次是用 newInstance创建的对象 都是不同的对象 代表不同的实例

操作成员变量
基本类

java

 
public class Student {
	public Student(){
		
	}
	//**********字段*************//
	public String name;
	protected int age;
	char sex;
	private String phoneNum;
	
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + ", sex=" + sex
				+ ", phoneNum=" + phoneNum + "]";
	}
}
测试代码

java

/**
 * @author : look-word
 * @date : 2022-04-05 21:55
 **/
public class TestField {

/*
 * 获取成员变量并调用:
 *
 * 1.批量的
 * 1).Field[] getFields():获取所有的"公有字段"
 * 2).Field[] getDeclaredFields():获取所有字段,包括:私有、受保护、默认、公有;
 * 2.获取单个的:
 * 1).public Field getField(String fieldName):获取某个"公有的"字段;
 * 2).public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)
 *
 * 设置字段的值:
 * Field --> public void set(Object obj,Object value):
 * 参数说明:
 * 1.obj:要设置的字段所在的对象;
 * 2.value:要为字段设置的值;
*/
    public static void main(String[] args) throws Exception{
        Class aClass = Class.forName("bean.Student");
        Student student = new Student();

        /*
 获取所有的共有字段
 */
        System.out.println("-------------------获取所有的共有字段--------------------");
        Field[] fields = aClass.getFields();
        for (Field field : fields) {
            /*
 filed => public java.lang.String bean.Student.username
 filed => 成员变量
 */

            /*
 我理解为 给某个对象的 成员变量 赋值
 当前的filed 为 username 因为这里只能获取为 共有属性的成员变量
 * field.set(student,"zhangsan");
 */
            field.set(student,"zhangsan");
            System.out.println(student);
            /*
 field.get(student);
 获取某student中的 field 的 内容
 */
            Object o = field.get(student);
            System.out.println(o);
            /*
 * 打印filed的内容 => public java.lang.String bean.Student.username
 */
            System.out.println(field);
        }

        System.out.println("-------------------给私有字段赋值--------------------");
        Field phone = aClass.getDeclaredField("phone");
        phone.setAccessible(true);// 设置无障碍 
        phone.set(student,"110");// 赋值给student对象

        System.out.println("-------------------获取私有字段--------------------");
        Field phone1 = aClass.getDeclaredField("phone");
        phone1.setAccessible(true);// 设置无障碍
        System.out.println(phone1.get(student));//取出student对象中的phone属性的值
    }
}
注意

在操作私有属性的时候 不管是获取还是设置值 都需要设置无障碍

setAccessible(true);// 设置无障碍

推荐】一下。

从零开始掌握RDMA拥塞控制:原理、算法与实战解析 本文深入解析了RDMA拥塞控制的核心原理与实战配置。RDMA依赖无损网络保障高性能,其关键在于PFC与ECN两大技术协同防止丢包。文章重点剖析了主流算法DCQCN的工作机制与参数调优,并简要介绍了HPCC与TIMELY等前沿算法。最后提供了在Linux上配置RoCEv2与DCQCN的详细步骤及性能调试方法,帮助读者从零构建稳定的RDMA网络环境。 阅读详情

相关推荐

【论文精读】Latent Diffusion

Latent Diffusion

weixin_44934783的博客 4476

什么是反射

维基百科上反射的定义: 在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。 难道不用反射就不能在运行时访问、检测和修改它本身的状态和行为吗? 问题的回答,其实要首先理解什么叫访问、检测和修改它本身状态或行为,它的本质是什么? 实际上,它的本质是程序在运行期探知对象的类...

Mreden的博客 2087

安卓 实现灯光闪过效果

有个小需求,给按钮加一个灯光划过的效果,这样的需求一般有UI,肯定就找UI了要个gif图不就完事了,可是这次没有,好久自己做一个嘛。Web端的大佬实现很快,到安卓这边呢,百度一搜发现诶?怎么没有,好吧自己来一个 一切动效相关的不给图看都是耍流氓 所以俺不能这么干啊,OK!直接上效果图,再来解释下怎么实现的 效果就是这样子,怎么实现呢? 从图分析下,就是一个光写着重左边移动要右边循环嘛,这有啥难的?? 来看一看我的第一版,第二版 这是个什么?????一点都不像啊? 赶紧再问了问Web端大佬,噢,加了一个

SummerCloudXT的博客 1378

Java中的反射机制

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。可以看出,同一般的反射

jxian6g的博客 499

【SEW-伺服电机-Profinet-io通讯控制——伺服配置】

SEW-伺服电机-Profinet-io通讯控制——伺服配置一、本次使用配置说明编写经历受国际形式与疫情影响相关资料查询阅读测试验证不易二、伺服配置流程1.基本准备条件2.硬件-电路连接3.设备在线连接4.软件-参数配置5.手动运行测试6.PN-IO自动控制配置8.PLC1200硬件组态9.PLC软件编程10.调试故障分析三、总结四、参考 一、本次使用配置说明编写经历 受国际形式与疫情影响 由于近期受国际形式影响以及全球疫情影响,Siemens等常用产品供货期与供货量严重受限,项目上不得不采取选用其它替代产

qq_39024187的博客 1万+

Arduino IDE 2配置ESP32-S3工程全指南

嵌入式开发中,Arduino框架通过硬件抽象层(HAL)大幅降低MCU入门门槛,其核心在于板级支持包(BSP)与底层构建系统(如ESP-IDF)的精准协同。理解CPU频率、Flash模式、分区表、PSRAM等关键配置,本质是掌握SoC时钟树、SPI Flash通信协议、内存映射与FreeRTOS调度机制的技术原理。这些参数不仅决定固件能否启动,更直接影响功耗、实时性、OTA升级与大容量应用(如LVGL、TFLite Micro)的可行性。本文以ESP32-S3为例,聚焦Arduino IDE 2.x环境下从

root9的博客 782

什么是反射?(详解)

反射是计算机编程中的一个重要概念,它指的是在运行时动态地获取对象的状态信息并对其进行操作的能力。在面向对象编程中,反射通常用于在程序运行时动态地创建对象、调用方法和修改属性等操作。反射的实现通常依赖于语言提供的特定机制或库。例如,Java提供了反射API,可以在运行时动态地加载类、创建对象、调用方法和获取属性值等。在.NET中,反射则通过System.Reflection命名空间下的类实现,可以实现类似的功能。

2301_77072336的博客 3175

非华为电脑也能用!华为电脑管家完美安装教程来了

GitHub 上有一个开源项目 ​****​,专门解决“非华为设备无法安装华为电脑管家”的问题。它通过智能模拟 + DLL 劫持技术,绕过官方对硬件型号的检测,让你在联想、戴尔、华硕甚至 DIY 主机上也能流畅使用华为电脑管家!⭐ 项目已获 ​700+ Stars​,社区活跃,持续更新,兼容性优秀!科技不该有围墙。如果你成功在非华为电脑上跑起了 PCManager,欢迎在评论区晒出你的设备型号 + 使用体验!也别忘了把这篇推文分享给同样“眼馋”华为生态的朋友 ~📱 ​关注我们。

程序员朱永胜 4917

反射概念及详解

Java中最强大的技术莫过于发射,在程序运行过程中,可以做很多操作 实例化任意一个类的对象 获取任意类的名称、包、属性、方法、注解、类型、类加载器等 获取任意对象的属性,并且能修改对象的属性 调用任意对象的方法 判断任意一个对象所属的类 新建User类 package com.rangers.reflects; /** * @Author Rangers * @Description * @Date 2021-03-09 **/ @TestAnnotation public class U

游骑兵 554

一网打尽身份验证与授权:深入剖析ASP.NET Core Identity在C#中的全方位实战应用

ASP.NET Core Identity 是 Microsoft 提供的一个强大且可扩展的身份验证和授权框架,用于构建基于用户账户、角色和权限的Web应用程序。它提供了用户注册、登录、密码管理、多因素认证、角色分配、授权等功能,与ASP.NET Core框架深度集成,简化了安全相关的开发工作。通过上述代码示例和注释,展示了如何安装配置Identity、自定义用户实体与数据库上下文、实现用户注册登录、管理角色与用户角色关系,以及如何使用授权策略保护应用程序资源。,并指定用户和角色类型以及主键类型。

java专栏 1527

SAP_SD模块_SAP 消息号VF501(科目确定期间出错)

摘要: SAP SD模块中执行VF02销售开票时出现“科目确定期间出错”(VF501)问题,主要原因是系统无法找到匹配的总账科目。解决方案包括:检查物料主数据和客户主数据中的科目分配组是否维护,核对发票中的对应字段,并通过VKOA事务代码分析科目确定逻辑。若定价过程中配置的科目代码(如Z01)未在VKOA中完整映射(如缺少H1+S5+Z01组合),则会导致内部价格无法关联总账科目。需在SPRO路径下完善科目代码分配配置,确保定价类型与科目代码匹配。本文提供了详细的排查步骤和配置方法,帮助解决开票过账错误。

我小时候很黑的博客 354

反射机制计算机语言,动态与弹性 细看编程语言的反射机制

因为可以在程序执行期改变自身的动态语言近年越来越流行,在新一期的编程语言排行榜中,动态语言Ruby得到了稳步提升。这篇文章将向您介绍动态程序设计语言的一个关键特性——反射机制。在不更动已编译好程序代码的情况下,却能大幅地影响程序的行为,这便是反射机制的动态威力所在许多接触过像Java及C#这类程序语言的程序人,或许对"Reflection(反射)" 这个名词不陌生,但实际上将这个技巧运作在日常开发...

weixin_34051133的博客 416

StarRocks 面试题及参考答案详解(万字详解)

Broker Load的过程通常涉及到数据的解析、转换和加载,它支持多种数据格式,并且可以处理复杂的数据导入任务。一方面,压缩可以减少磁盘I/O操作,因为压缩后的数据占用的空间更小,需要读取的数据块数量也就更少。在StarRocks中,表数据可以被划分成多个分区,每个分区包含表的一部分数据。在传统的行存储模型中,数据是按行组织的,这意味着在执行分析查询时,系统需要读取并处理整行数据,即使很多时候只需要查询其中的少数几列。物化视图的更新可以是完全重算,也可以是增量更新,取决于物化视图的定义和数据变更的模式。

大模型大数据攻城狮的专栏 2082

java反射的概念与原理

Java反射是一种强大的工具,可以实现在运行时动态地访问和修改类的信息。通过使用反射,可以编写更加灵活和动态的应用程序。然而,反射也存在一定的性能开销和安全性问题,因此在实际应用中需要权衡其利弊。掌握Java反射的基本概念和用法后,可以进一步探索更高级的反射特性和应用场景。

yuehua00的专栏 413

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

通过反射获取实体类属性的get方法_java反射机制的讲解

一 , 什么是java反射机制?JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。1.意义首先,反射机制极大的提高了程序的灵活性和扩展性,降低模块的耦合性,提高自身的适应能力。其次,通过反射机制可以让程序创建和控制任何类的对象,无需提前硬编码目标...

weixin_39571749的博客 2939

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java反射

反射 getIncetan

hongto57的专栏 595

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

反射是什么?

反射在平时开发中使用几率较小,但在各大框架中会频繁使用,如果有意向成为架构师,这块知识的掌握必不可少。

Steins Gate 5624

Java反射篇

Java反射篇 动态语言与静态语言的区别? 动态语言:在运行时代码可以根据某些条件改变自身结构。举例:JavaScript, PHP, Python。 静态语言:运行时结构不可变的语言就是静态语言。举例:Java, C, C++。 说明:由于反射机制的存在,Java可以称为“准动态语言”。 1.反射的定义 Java 反射,就是在运行状态中: 获取任意类的名称、package信息、所有属性、方法、注解、类型、类加载器等; 获取任意对象的属性,并且能改变对象的属性; 调用任意对象的方法; 判断任意一个对象

m0_37775931的博客 164

c#中的反射

反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表, 当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等 反射的原理: .net所编写的程序集包含两个重要部分:IL(中间语言代码) 和metadata(元数据)。我们编写的代码中不是有很多很多的类吗,类有很多...

weixin_38166560的博客 66

反射

为什么要学习反射? 首先说一点:反射是比较低级的一个知识,如果是单纯的撸码来是实现功能的话,反射基本用不到,而且反射的性能呢也肯定不怎么好的,但是我个人觉得反射是一个很重要的知识点,在我老早学习的时候就是这么认为的,主要的原因有2点: 1,java的编译和运行。java是强类型语言,运行java每一个对象都会出现2个种类型:编译时类型和运行时类型,好多的知识点都只是关于编译时类型的,比如说

LinkinPark的博客 723

C#反射和特性

什么是元数据,什么是反射 程序是用来处理数据的,文本和特性都是数据,然而程序本身也是数据 有关程序及其类型的数据被称为元数据(metadata),他们保存在程序的程序集中 程序在运行时,可以查看其他程序集或者本身的元数据。一个运行的程序查看本身的元数据或者其他程序集的元数据的行为叫做反射 Type类 预定义类型(int long string等)BLC中的类型(Console,IEnumer...

高大猛 363

java 反射 systemproperties_Android Studio中使用SystemProperties

概述Android的系统属性相当于Windows的注册表,由key和value组成,且都是核心系统的一个基本机制。相对于Windows的注册表,Android的系统属性要简单一些,它没有Windows注册表的树状结构,而只是一个列表,也就是说没有父子关系。value有string,int,long,boolean,但是设置只能通过字符串方式。读取系统属性,是通过SystemProperties类来...

weixin_33765593的博客 627

python之通过“反射”实现不同的url指向不同函数进行处理(反射应用一)

1、简单概括下面定义了三个不同的模块用于测试,account.py 模块里有login()和logout(),admin.py模块里有index()。在这里模拟一个url的访问,意思是通过访问不同的url来指向到不同的模块里的函数进行处理,也可以说是处理这个url请求。那么这个就是通过“反射”机制来实现的。拓展一下,现在几乎所有的语言(不管是php,python,java,....

weixin_34310127的博客 156

深入.net平台和C#编程(序列化和反射)

序列化和反序列化 序列化和反序列化是将对象的状态存储到特定存储介质的过程 命名空间 using System.Runtime.Serialization.Formatters.Binary; 在类的头部添加[Serializable],表示该类可序列化 Using方法: 前提有实现接口 using自动释放 读写器.推荐使用file类的方法 序列化固定写法: 序列化类 BinaryFormatter BF = new BinaryF...

m0_56245036的博客 433

c# 反射浅谈

反射的概述反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等。System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码。 反射的作用:1. 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现 有对象中获取类型2. ...

weixin_33754065的博客 61

【Go】【反射】反射基本介绍和使用

运行时(而不是编译)可以动态的获取变量的信息,如变量的类型Type、类型Kind对于结构体变量,可以获取到结构体的字段、Tag、调用结构体对应方法反射可以修改变量的值SetXxx使用反射 import “reflect”Kind()Elem()

皮特儿的博客 2374
上一篇: 【深度学习 论文篇 01-1 】AlexNet论文翻译
下一篇: C#多线程下的调优
pythonxxoo
博客等级 码龄5年 337粉丝 670原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值