Java利用反射创建实体类、设置实体类属性、调用实体类的方法(含传参)、
创始人
2025-05-28 03:57:07
0

1. 问题描述

这里我们使用 java 的反射特性,完成几个简单的例子,用于学习总结。

2. 准备工作

创建一个类,含有属性和方法,用于接下来我们通过反射创建它的对象,调用它的方法,修改它的属性。

package cn.smileyan.reflex.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Map;/*** Student 类 用于测试* @author Smileyan*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {private Integer age = 0;private String name = "Tom";public void say(String msg) {System.out.printf("%s %d %s\n", name, age, msg);}public void say() {System.out.printf("%s %d\n", name, age);}private void secret() {System.out.printf("%s %d 私有方法\n", name, age);}public void walk(String way, Integer distance) {System.out.printf("%s %d %s %d\n", name, age, way, distance);}public void walk(Map params) {walk(params.get("way").toString(), (Integer) params.get("distance"));}
}

3. 使用 java 原生的方法

3.1 构造方法

  1. 使用字符串(类的路径)创建类,再通过newInstance创建对象。
    // 1.1 通过字符串获得类,并创建对象(不穿参数),再调用两个public方法
    Class clazz1 = (Class) Class.forName("cn.smileyan.reflex.entity.Student");
    Student student1 = clazz1.getConstructor().newInstance();
    student1.say();
    student1.say("reflex1");
    
  2. 通过字符串构建类,并创建对象(传参),再调用两个public方法
    // 1.2 通过字符串构建类,并创建对象(传参),再调用两个public方法
    Class clazz2 = (Class) Class.forName("cn.smileyan.reflex.entity.Student");
    Student student2 = clazz2.getConstructor(Integer.class, String.class).newInstance(2, "Jerry");
    student2.say();
    student2.say("reflex2");
    
  3. 通过类.class创建实体(推荐)
    // 1.3 通过类创建实体
    Class clazz3 = Student.class;
    Student student3 = clazz3.getConstructor(Integer.class, String.class).newInstance(3, "Jack");
    student3.say();
    student3.say("reflex3");
    

3.2 通过反射调用类的对象的方法

  1. 通过字符串不创建实体类而是通过方法名调用方法
    // 1.4 通过字符串不创建实体类而是通过方法名调用方法
    Class clazz4 = Class.forName("cn.smileyan.reflex.entity.Student");
    Method method4 = clazz4.getDeclaredMethod("say");
    System.out.println("方法名:" + method4.getName() + " 方法返回类型" + method4.getReturnType());
    System.out.println();
    
  2. 通过字符串不创建实体类而是通过方法名调用方法,并传入参数。
    // 1.5 通过反射调用对象的某个方法
    Student student5 = new Student();
    Class clazz5 = Student.class;
    Method method5 = clazz5.getDeclaredMethod("say", String.class);
    method5.invoke(student5, "reflex5");
    System.out.println();
    

4. 使用 ReflectASM 反射方法

添加依赖:

        com.esotericsoftwarereflectasm1.11.9
// 1. 创建对象
ConstructorAccess constructor1 = ConstructorAccess.get(Student.class);
Student student1 = constructor1.newInstance();
student1.say();
System.out.println();// 2. 调用方法
Student student2 = new Student();
MethodAccess methodAccess1 = MethodAccess.get(Student.class);
methodAccess1.invoke(student2, "setName", "Awesome McLovin");
methodAccess1.invoke(student2, "say");
System.out.println();

其他的地方相差不大。

注意: 两种方法中均需要注意,如果掉用 private 方法,或者访问 private 属性,需要设置

method.setAccessible(true);

5. 总结

反射还会有更多的应用场景,这里只是简单的记录一下,今后收集到更多案例再进行补充。

Smileyan
2023.03.14 23:23

相关内容

热门资讯

最新或2023(历届)天津户口...   最新或2023(历届)天津户口新政策:  针对最新或2023(历届)天津本地院校应届毕业生,各年...
最新或2023(历届)深圳户口...  最新或2023(历届)深圳户口新政策:  深圳积分入户政策总体在不断放宽,特别是对于高学历或者高技...
最新或2023(历届)广东启动...   近日,广东省政府正式印发了《关于进一步推进我省户籍制度改革的实施意见》(以下简称《意见》)。今天...
最新或2023(历届)云南户籍...   *全面放开建制镇和小城市落户限制  除昆明市主城区(含五华区、盘龙区、西山区、官渡区、呈贡区,下...
最新或2023(历届)广州市户...  广州市积分制入户管理办法  第一条为合理控制人口规模,优化人口结构,提高人口素质,促进人口与经济、...
2019年国赛高教杯数学建模A... 2019年国赛高教杯数学建模 A题 高压油管的压力控制 原题再现   燃油进入和喷出高压油管是许多燃...
23.3.16总结 简单搜索&&进阶搜索 - Virtual Judge (vjudge.net) D - Shuffl...
最新或2023(历届)非婚生子...  我国《婚姻法》第二十五条规定:非婚生子女享有与婚生子女同等的权利,任何人不得加以危害和歧视。而依据...
最新或2023(历届)武汉最新... 先来说说要成为武汉户口,主要有哪些渠道:  1、外地人员购买武汉市商品房可申办武汉户口  2、本科及...
最新或2023(历届)农村小孩...   从即日起至10月底专项解决各省历年出生人口未落户问题  非婚生或超生人口难落户口问题,将可全面获...
最新或2023(历届)最新厦门... 积分落户有哪些“门槛”?  积分落户制度已经在北京、天津、广东等诸多省市实行。落户者的分值计算分别包...
深入理解JVM干货教学 - 【... 🔥深入理解JVM干货教学 - 【Java对象结构】 1、Java检测工具ÿ...
北京户口新政策最新或2023(...  如果你是一名大学应届毕业生,恭喜你。你比一般想拿北京户口的人要轻松很多。通常来说,只要你找到一份能...
Qt 第35课、文本编辑器中的... 1、QAction 的信号 QAction 被点击之后会产生一个 triggered 信号 — 通过...
福建户籍制度改革最新消息 福建... 建将建立人口综合信息库,并实现跨部门、跨地区共享。  据了解,目前,福建正在优化和完善城乡统一的户口...
avue-crud组件的行内编... 前言 关于 avue 框架,其实本来不想写一篇随笔记录的,因为目前在网上...
最新或2023(历届)上海户口...  一、上海户口新政策-改革目的  对于此次改革的目的,方案明确指出“基于国家户籍制度改革的新趋势,以...
[数据分析与可视化] Pyth... 本文主要介绍GeoPandas的基本使用方法,以绘制简单的地图。GeoPandas是一...
案例16-消息队列的作用和意义 目录一:背景介绍二:消息队列概念:目的:解耦...
晋国到底起源于什么地方 不是在... 还不知道:晋国到底起源于什么地方的读者,下面趣历史小编就为大家带来详细介绍,接着往下看吧~山西的许多...