Java - 通过反射进行赋值以及函数调用

news2024/9/22 15:44:31

Java - 通过反射进行赋值以及函数调用

  • 前言
  • 一. 通过反射进行赋值
    • 1.1 测试
    • 1.2 总结
  • 二. 通过反射进行函数调用

前言

说来惭愧,虽然反射在Java中是非常重要和常见的一种机制。但是,每当自己去写这方面的代码的时候,总是容易愣住。还得想一想代码怎么写。因此写下这篇文章做个笔记。

可以先看下这篇文章 Java-通过反射来打印类

一. 通过反射进行赋值

1.我们准备一个Teacher类,并把相关的属性都设置为private私有。准备他的get函数,set就不必啦。

public class Teacher {
    private int userId;
    private String userName;

    public int getUserId() {
        return userId;
    }

    public String getUserName() {
        return userName;
    }

    private void hello(String name, Integer userId) {
        System.out.println("Hello World," + name + ", " + userId);
    }
}

那么我们如何通过反射来进行赋值呢?关键代码:拿到这个类中的字段。

Field fieldName= xxx.class.getDeclaredField("fieldName");

1.1 测试

测试1:

@org.junit.Test
public void test3() throws Exception {
    Teacher teacher = new Teacher();
    Field userName = Teacher.class.getDeclaredField("userName");
    // 授权访问私有成员变量
    userName.setAccessible(true);
    userName.set(teacher, "ljj");
    System.out.println(teacher.getUserName());:
    System.out.println(teacher.getUserId());
}

结果如下:可见userId输出为0。因为我们没有对它进行赋值。所以初始值为0,而userName则赋值成功。
在这里插入图片描述
测试2:setAccessible我们设置为false(默认)

@org.junit.Test
public void test3() throws Exception {
    Teacher teacher = new Teacher();
    System.out.println(teacher.getUserId());
    Field userId = Teacher.class.getDeclaredField("userId");
    userId.setAccessible(false);
    userId.set(teacher, 10);
    System.out.println(teacher.getUserId());
}

结果如下:
在这里插入图片描述
测试3:setAccessible设置为true,然后再次赋值userId

@org.junit.Test
public void test3() throws Exception {
    Teacher teacher = new Teacher();
    System.out.println(teacher.getUserId());
    Field userId = Teacher.class.getDeclaredField("userId");
    userId.setAccessible(true);
    userId.set(teacher, 10);
    System.out.println(teacher.getUserId());
}

结果如下:
在这里插入图片描述
测试4:给Teacher加一个public类型的属性address

public String address;
public String getAddress() {
    return address;
}

测试如下:

@org.junit.Test
public void test3() throws Exception {
    Teacher teacher = new Teacher();
    Field address = Teacher.class.getDeclaredField("address");
    address.set(teacher, "abcd");
    System.out.println(teacher.getAddress());
}

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

1.2 总结

  1. 可以通过Field name= Object.class.getDeclaredField("name");的方式拿到类的字段。
  2. 通过name.set(Target, value);进行属性的赋值。
  3. 如果字段是私有的,还需要设置setAccessible(true); 其他不需要。

二. 通过反射进行函数调用

关键代码:

Method method = Teacher.class.getDeclaredMethod(方法名称, 参数类型1.class, 参数类型2.class,...);

以本文案例为例:

private void hello(String name, Integer userId) {
    System.out.println("Hello World," + name + ", " + userId);
}

那么不难写出代码如下:

@org.junit.Test
public void test3() throws Exception {
    Teacher teacher = new Teacher();
    // 写对方法名称、参数类型
    Method hello = Teacher.class.getDeclaredMethod("hello", String.class, Integer.class);
    // 因为是私有的,所以要想访问,需要设置Accessible
    hello.setAccessible(true);
    // 对应的参数
    Object[] objects = {"LJJ", 24};
    // 调用函数
    hello.invoke(teacher, objects);
}

结果如下:
在这里插入图片描述

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

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

相关文章

题库API搭建接口

题库API搭建接口 本平台优点:免费查题接口搭建 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库:题库后台http://daili.jueguangzhe.cn/ 题库后台…

社招前端vue面试题汇总

用过pinia吗?有什么优点? 1. pinia是什么? 在Vue3中,可以使用传统的Vuex来实现状态管理,也可以使用最新的pinia来实现状态管理,我们来看看官网如何解释pinia的:Pinia 是 Vue 的存储库&#xff…

机器学习数据不均衡处理教程

机器学习数据不均衡处理教程 学习对数据进行过采样和欠采样、应用 SMOTE、集成方法和成本敏感型学习假设 课程英文名:Machine Learning with Imbalanced Data 此视频教程共13.5小时,中英双语字幕,画质清晰无水印,源码附件全 下…

Apriori算法及例题

一:Apriori算法介绍 关联规则挖掘是数据挖掘中最活跃的研究方法之一 。最早是由 Agrawal 等人提出的1993最初提出的动机是针对购物篮分析问题提出的,其目的是为了发现交易数据库中不同商品之间的联系规则。这些规则刻画了顾客购买行为模式,可…

Java去除文档阴影

Java去除文档阴影 一、前言 文稿扫描大家用的都比较频繁、想是各种证件、文件都可以通过扫描文稿功能保存到手机。相比直接拍照,在扫描文稿时,程序会对图像进行一些矫正。比如去除阴影、修正倾斜、旋转矫正等。进行这些处理后的图片要更加容易识别。今…

学习下c++原来它和Java有很多相似的地方

Java和CJava和C区别简单学习下C语法C 是什么?C工作原理:C标识符C基本数据类型C关键字封装,继承,多态简单回顾下Java语法Java的基础语法:Java注释Java标识符Java修饰符Java 接口和继承Java8 新增的特性Java和C区别 Java…

VTK-vtkPointInterpolator/vtkInterpolatorKernel

欢迎大家加入社区,雪易VTK社区-CSDN社区云 前言:目前在做模型的ReMesh,在研究这个接口,希望能有所帮助。 vtkPointInterpolator 描述: 变量: Strategy:MASK_POINTS, NULL_VALUE, CLOSEST_POI…

【css遇到的问题】vue中使用select下拉框,数据绑定但是默认不显示问题

文章目录问题描述原因分析问题描述 在vue中使用原生的select下拉框的时候,绑定数据内容但是发现其中默认显示第一条的并不显示 需求实现效果 实际实现效果 循环出select内的数据以后,发现原本默认显示第一条的select框变成了空白,要选择后…

【Mysql】事务

文章目录一.什么是事务1.1. 事物的属性1.2. 事务的版本支持1.3. 事务的提交方式1.4. 事务常见操作证明事务的回滚事务崩溃情况下验证回滚结论二.事务隔离级别2.1. 如何理解隔离性2.2. 隔离性级别2.3. 脏读,幻读,不可重复读2.4. 查看,设置隔离级别2.5. 隔离性验证三.一致性(Cons…

T046基于51单片机无线蓝牙控制8位LED灯亮灭proteus仿真原理图PCB

功能: 0.本项目采用STC89C52作为单片机系统的控制MCU 1.通过蓝牙发送指令控制LED灯 2.通过手机APP可以控制8路LED灯的亮灭,可以全亮全灭。 3.通过手机APP可以控制8路LED灯的亮度。每个灯的亮度有3档。具体控制指令如下 a)发送Ox,开启指定LED灯…

日常学习之:Yaml 和 Json 有什么区别

安装 json 是 python 内置 yaml 需要安装 pip install pyyaml格式 对于同样一段数据: test_data {"金山中学":{"101班":{"王宁": {"语文":33,"数学":22,"英语":18}}}}我们用下面的代码分别存入 ya…

ALE的基本介绍、使用与配置

本文将介绍ale插件的基本使用与配置,将从linter的介绍到具体插件的使用与bug的修复~ 本文仅仅时抛砖引玉,更多的使用技巧与功能可以查看项目介绍 ALE的基本介绍、使用与配置ale的介绍ale的基本配置与使用查看你可用的linter安装iverilog——for windowal…

Redisson之lock()和tryLock()的区别

Redisson之lock()和tryLock()的区别和原理解析 在Redisson中 lock() 方法 与 tryLock() 方法是有区别的! 我们先来阐述两者的区别,再分析它们的源码。 lock() 与 tryLock() 的区别 (1)返回值: lock() 是没有返回值…

Vue中的diff算法深度解析

模板tamplate经过parse,optimize,generate等一些列操作之后,把AST转为render function code进而生成虚拟VNode,模板编译阶段基本已经完成了,那么这一章,我们来探讨一下Vue中的一个算法策略–dom diff 首先来介绍下什么…

Java8 遍历List 使用stream().parallel()并发安全

1. parallelStream是什么: java 8引入了并行流的概念来进行并行处理,而并行流(Parallel Stream)利用所有可用CPU内核的优势,并行处理任务。其原理(Parallel Stream)是可以把大任务分成多个小任务执行, 最后再把执行结果进行合并, ForkJoinPoo…

数仓DWS层之旁路缓存优化

优化原因: 外部数据源的查询常常是流式计算的性能瓶颈。以本程序为例,每次查询都要连接 Hbase,数据传输需要做序列化、反序列化,还有网络传输,严重影响时效性。可以通过旁路缓存对查询进行优化。 旁路缓存模式是一种非…

利用Python海龟绘图画一个世界杯的足球

利用Python海龟绘图画一个世界杯的足球 花有重开日 人无再少年 四年一次的世界杯快要结束,为了纪念此次世界杯,特意用Python画了一个足球。 1.设计思路以及实现效果 世界杯足球实现思路: 首先使用海龟画一个圆形作为足球的外边框。然后在足…

3天带你走向实战!阿里顶配版Spring全家桶面试进阶笔记有多强?

Spring框架自从诞生以来就一直备受开发者青睐,它涵盖了Spring、Springboot、SpringCloud等诸多解决方案,一般我们都会统称为Spring全家桶!出于Spring框架在Java开发者心中中的统治地位,所以不管是面试还是工作,Spring都…

夜神模拟器+fiddler抓包(抓取APPhttps请求,删除sll证书校验)

1.安装fiddler https://telerik-fiddler.s3.amazonaws.com/fiddler/FiddlerSetup.exe (下载不了直接去官网找) 2.配置 开启https请求抓取,不抓https可忽略2.修改或查看端口(使用默认8888端口,要自定义端口可修改&#…

Arduino 定时器中断

Arduino 定时器中断 Circuits Arduino 查看原文 简介:Arduino 定时器中断 奥雷里(地球、月亮和太阳) 立式兰花播种机 胶合板书柜扬声器 计时器中断允许您以非常特定的时间间隔执行任务,而不管代码中发生了什么其他事情。我…