你真的明白Java中的反射吗???

news2024/9/24 22:26:02

1.什么是反射?

Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取信息以及动态调用对象的方法的功能称为 java 语言的反射机制。

2. 反射实操

案例一:

获取对象使用Class.forName()

创建对象使用 clazz.getConstructor(),然后初始化对象使用 construoctor.newInstance()

调用方法使用 clazz.getMethod(获取指定方法名),使用method.invoke(obj)获取方法返回的结果

(1)获取Class对象:

Class<?> clazz = Class.forName("java.lang.String");

(2)创建对象:

Constructor<?> constructor = clazz.getConstructor(String.class);

Object obj = constructor.newInstance("Hello World");

(3)调用方法:

Method method = clazz.getMethod("toUpperCase");

String result = (String) method.invoke(obj);

System.out.println(result);        //输出结果:HELLO WORLD

示例代码:

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

class Person {
    private String name;
    private Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    // 添加 getter 和 setter 方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        Class<?> clazz = Class.forName("Person");
        // 获取带有 String 和 Integer 参数的构造函数
        Constructor<?> constructor = clazz.getConstructor(String.class, Integer.class);
        // 使用正确的参数创建对象
        Object person = constructor.newInstance("shenghao", 21);

        // 获取 getName 方法
        Method method = clazz.getMethod("getName");
        // 调用方法并获取结果
        String result = (String) method.invoke(person);
        System.out.println(result); // 应该输出: shenghao

    }
}

案例二:

(1)获取Class对象

Class<?> clazz = Person.class;

(2)创建对象(还是使用Constructor创建)

Constructor<?> constructor = clazz.getConstructor();

Person person  = (Person)constructor. newInstance();

或则

 

Constructor<?> constructor = clazz.getConstructor(String.class,Integer.class);

Person person  = (Person)constructor. newInstance("shenghao",21);

(3)获取字段

Field nameField = clazz.getDeclaredField("name");

Field ageField = clazz.getField("age");

(4)设置字段

因为name和age是私有字段(使用private修饰),所以使用setAccessible(true),运行字段可访问

nameField.setAccessible(true);

ageField.setAccessible(true);

开始设置字段信息

nameField.set(person,"Bob");

ageField.set(person,25);

 

(5)获取字段值并打印

System.out.println(nameField.get(person));        // 输出Bob

System.out.println(ageField.get(person));         // 输出25

示例代码:

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

// 定义 Person 类
class Person {
    private String name;
    private Integer age;

    public Person(){

    }

    // 带参数的构造函数
    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    // getter 和 setter 方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

// 主类
public class Main {
    public static void main(String[] args) throws Exception {
        // 获取 Person 类的 Class 对象
        Class<?> clazz = Person.class;

        // 获取并使用无参数的构造函数创建 Person 对象
        Constructor<?> constructor = clazz.getConstructor();
        Person person = (Person) constructor.newInstance();

        // 获取私有字段
        Field nameField = clazz.getDeclaredField("name");
        Field ageField = clazz.getDeclaredField("age");

        // 设置字段可访问(跳过 Java 的访问控制检查)
        nameField.setAccessible(true);
        ageField.setAccessible(true);

        // 设置字段值
        nameField.set(person, "Bob");
        ageField.set(person, 25);

        // 获取字段值并打印
        System.out.println(nameField.get(person)); // 输出: Bob
        System.out.println(ageField.get(person)); // 输出: 25
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重塑“万免”电商平台的魅力与潜力

今天&#xff0c;我想与大家深入探讨一个近期在电商领域备受瞩目的新概念——“万免”电商平台。我们将一同剖析其独特的运营模式&#xff0c;挖掘它在私域电商领域的非凡魅力与潜在价值。 一、万免模式的创新解读 万免联盟&#xff0c;一个旨在打破传统电商界限的创新平台&am…

内生性检验与过度识别检验

目录 一、文献综述 二、理论原理 三、实证模型 四、程序代码 一、文献综述 内生性问题在经济学和社会科学研究中一直是一个关键挑战&#xff0c;众多学者致力于寻找有效的方法来解决这一问题并确保研究结果的可靠性。 Angrist 和 Krueger&#xff08;1991&#xff09;在研究…

信用卡存量经营读书笔记

信用卡的各项收益和损失分析表 用杜邦分析法拆利润如下 信用卡要不要烧钱&#xff1f;不要&#xff0c;因为没有网络效应&#xff08;用户量增加带来的优惠比较少&#xff09;和赢家通吃的情况 线上获客的几种方式&#xff1a;引流分成、某个项目的联名信用卡、营业收入分成 …

828华为云征文 | 使用Linux管理面板1Panel管理华为云Flexus云服务器X实例

828华为云征文 | 使用Linux管理面板1Panel管理华为云Flexus云服务器X实例 一、华为云Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点 二、1Panel介绍2.1 1Panel 简介2.2 1Panel 特点 三、本次实践介绍3.1 本次实践简介3.2 本次环境规划 四、购…

【machine learning-17-分类(逻辑回归sigmod)】

分类问题 先说一下什么是分类问题&#xff0c;举个例子&#xff1a; 判定一封邮件是否是垃圾邮件&#xff1b; 判定图片是不是一直猫&#xff1b; 等等 这些问题的答案都是有限的&#xff0c;而不像是线性回归&#xff0c;是存在无限可能的不确定值。 这种问题就是分类问题&am…

分区与分桶

分区 分区字段大小写&#xff1a; 在hive中&#xff0c;分区字段名是不区分大小写的&#xff0c;不过字段值是区分大小写的。我们可以来测试一下 导入数据 load data local inpath /home/hivedata/user1.txt into table part4 partition(year2018,month03,DAy21); load data …

Mysql——初识Mysql

目录 数据库基础 创建数据库 服务器&#xff0c;数据库&#xff0c;表关系 数据逻辑存储 MySQL架构 SQL分类 存储引擎 mysql服务端是一个网络服务器&#xff0c;采用的是TCP协议在应用层 &#xff0c;mysql有自己的协议。 数据库基础 mysql不是数据库&#xff0c;是mysql的…

18.1 k8s服务组件之4大黄金指标讲解

本节重点介绍 : 监控4大黄金指标 Latency&#xff1a;延时Utilization&#xff1a;使用率Saturation&#xff1a;饱和度Errors&#xff1a;错误数或错误率 apiserver指标 400、500错误qps访问延迟队列深度 etcd指标kube-scheduler和kube-controller-manager 监控4大黄金指标 …

从手动测试菜鸟,到自动化测试老司机,实现自动化落地

虽然许多伙伴是一个测试老人了&#xff0c;但是基本上所有的测试经验都停留在手工测试方面&#xff0c;对于自动化测试方面的实战经验少之又少。 其实&#xff0c;究其原因&#xff1a;一方面是&#xff0c;自动化方面不求上进&#xff0c;觉得会手工测试就可以了&#xff0c;自…

【计算机基础】用bat命令将Unity导出PC包转成单个exe可执行文件

Unity打包成exe可执行文件 上边连接是很久以前用过的方法&#xff0c;发现操作有些不一样了&#xff0c;并且如果按上述操作比较麻烦&#xff0c;所以写了个bat命令。 图1、导出的pc程序 如图1是导出的pc程序&#xff0c;点击exe文件可运行该程序。 添加pack_project.bat文件 …

基于 SpringBoot 的在线考试系统

专业团队&#xff0c;咨询就送开题报告&#xff0c;欢迎大家私信留言&#xff0c;联系方式在文章底部 摘 要 网络的广泛应用给生活带来了十分的便利。所以把在线考试管理与现在网络相结合&#xff0c;利用java技术建设在线考试系统&#xff0c;实现在线考试的信息化管理。则对…

PX4固定翼控制器详解(五)——L1、NPFG控制器

之前已经讲解了TECS高度与速度控制器&#xff0c;今天是PX4固定翼控制器系列讲解的最后一期&#xff0c;主题是PX4的位置控制器。PX4 1.12及其之前的版本&#xff0c;使用的位置控制器为L1控制器。1.13及其之后的版本&#xff0c;PX4更新了NPFG控制器。NPFG控制器在较强风速下有…

活动目录安全

活动目录安全 1.概述2.常见攻击方式SYSVOL与GPP漏洞MS14-068漏洞Kerberoast攻击内网横移抓取管理员凭证内网钓鱼与欺骗用户密码猜解获取AD数据库文件 3.权限维持手段krbtgt账号与黄金票据服务账号与白银票据利用DSRM账号利用SID History属性利用组策略利用AdminSDHolder利用SSP…

宠物空气净化器去浮毛哪家强?希喂、美的和米家实测分享

要说养宠物后里最让我感到幸福感飙升的家电&#xff0c;必须是宠物空气净化器&#xff0c;没有之一。很多人都喜欢宠物&#xff0c;但应该没有人喜欢清扫&#xff0c;特别是家里宠物多&#xff0c;或者一群宠物在自己家聚在一起之后&#xff0c;要疯狂清除浮毛&#xff0c;真的…

剖解相交链表

相交链表 思路&#xff1a;我们计算A和B链表的长度&#xff0c;求出他们的差值&#xff08;len&#xff09;&#xff0c;让链表长的先多走len步&#xff0c;最后在A,B链表一起向后走&#xff0c;即可相逢于相交节点 实现代码如下&#xff1a; public class Solution {public …

单链表进阶

之前已经介绍过单链表及其一些简单的功能 这次来简单介绍单链表一些的其他接口 1.在指定位置之前插入数据 具体原码&#xff0c;三个参数&#xff0c;phead是链表的指针&#xff0c;pos是节点的地址&#xff0c;x是需要插入的数据。 pos不能为空指针&#xff0c;因为pos为空…

React启动时 Error: error:0308010C:digital envelope routines::unsupported

错误信息&#xff1a; 错误原因&#xff1a;通常与 Node.js 的新版本中 OpenSSL 的默认行为变化有关。从 Node.js 17 开始&#xff0c;OpenSSL 默认启用了 OpenSSL 3.0 的一些新特性&#xff0c;这可能会影响到一些旧的或未更新的库。 解决办法&#xff1a;可以通过设置环境变…

基于STM32设计的室内育苗环境管理系统(物联网)

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成 1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发 1.5 模块的技术详情介绍【1】ESP8266-WIFI模块【2】MQ135传感器【4】DHT11传感器【5】B1750传感器 …

【Diffusion分割】FDiff-Fusion:基于模糊学习的去噪扩散融合网络

FDiff-Fusion: Denoising diffusion fusion network based on fuzzy learning for 3D medical image segmentation 摘要&#xff1a; 近年来&#xff0c;去噪扩散模型在图像分割建模中取得了令人瞩目的成就。凭借其强大的非线性建模能力和优越的泛化性能&#xff0c;去噪扩散模…

Flexus X实例全方位指南:智能迁移、跨云搬迁加速与虚机热变配能力的最佳实践

目录 前言 一、云迁移关键挑战 1、企业实例选型关键挑战 2、云算力关键挑战之一 3、云算力关键挑战之二 二、本地IT及其他云搬迁到Flexus X实例上的独有优势 1、Flexus X实例超强性能&#xff0c;遥遥领先同规格友商实例 &#xff08;1&#xff09;底层多重调优&#x…