当前位置: 首页 > news >正文

反射机制(简单版)

反射:动态引入类、动态调用实例的成员函数、成员变量等。

常用API:

(1) java.lang.Class
(2) java.lang.reflect.Method
(3) java.lang.reflect.Field
(4) java.lang.reflect.Constructor

举例

package org.yxc;public class Calculator {public String name;public Calculator() {}public Calculator(String name) {this.name = name;}public int add(int a, int b) {return a + b;}
}
package org.yxc;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class Main {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {Class<?> cls = Class.forName("org.yxc.Calculator");Object o = cls.newInstance();Method method = cls.getMethod("add", int.class, int.class);int res = (int)method.invoke(o, 3, 4);System.out.println(res);Field field = cls.getField("name");field.set(o, "My Calculator!");System.out.println(field.get(o));Constructor<?> constructor = cls.getConstructor(String.class);Object new_o = constructor.newInstance("New Calculator!");System.out.println(new_o);}
}

这段代码展示了如何通过反射机制动态地加载类、调用方法、访问字段和调用构造方法。具体解释如下:

1. 引入反射库

import java.lang.reflect.*;

代码中使用了ClassNotFoundExceptionInstantiationExceptionIllegalAccessExceptionNoSuchMethodExceptionInvocationTargetException等异常处理,这些与反射库中的java.lang.reflect类息息相关。

2、加载类

Class<?> cls = Class.forName("org.yxc.Calculator");
  • Class.forName("org.yxc.Calculator"):根据类名字符串加载类 org.yxc.Calculator
  • 该方法会返回一个Class<?>对象,表示指定的类。

3、实例化对象

Object o = cls.newInstance();
  • cls.newInstance():调用类的无参构造函数创建一个Calculator的实例。
  • 返回值是一个Object类型,表示类的实例。

4、调用方法

Method method = cls.getMethod("add", int.class, int.class);
int res = (int)method.invoke(o, 3, 4);
System.out.println(res);
  • cls.getMethod("add", int.class, int.class):获取名称为add且参数类型为两个int的公共方法。
  • method.invoke(o, 3, 4):调用该方法,传入实例对象o和参数3, 4。返回结果存入res
  • 最后打印结果res

5、访问字段

Field field = cls.getField("name");
field.set(o, "My Calculator!");
System.out.println(field.get(o));
  • cls.getField("name"):获取名为name的公共字段。
  • field.set(o, "My Calculator!"):设置对象oname字段的值为 "My Calculator!"
  • field.get(o):获取对象oname字段的值,并打印出来。

6、调用构造函数

Constructor<?> constructor = cls.getConstructor(String.class);
Object new_o = constructor.newInstance("New Calculator!");
System.out.println(new_o);
  • cls.getConstructor(String.class):获取参数类型为String的公共构造函数。
  • constructor.newInstance("New Calculator!"):使用该构造函数创建一个新实例,传入参数"New Calculator!"
  • System.out.println(new_o):打印新创建的实例。

这段代码展示了 Java 反射的基本操作,涉及动态加载类、调用方法、访问字段以及调用构造函数。反射可以在运行时处理类的结构,非常灵活,但也可能带来性能开销和安全性问题。


http://www.mrgr.cn/news/61844.html

相关文章:

  • kafka 分布式(不是单机)的情况下,如何保证消息的顺序消费?
  • 怎么实现电脑控制100台手机,苹果手机群控系统不用越狱实现新突破
  • Python Transformer 模型的基本原理:BERT 和 GPT 以及它们在情感分析中的应用
  • 【Axure原型分享】颜色选择器——填充颜色
  • WPF+MVVM案例实战(三)- 动态数字卡片效果实现
  • (史上超级清晰带图解)红黑树的实现--C++
  • Nature: 一种基于宏基因组序列空间生成无参考的蛋白质家族的计算方法
  • 算法日记 13 day 二叉树
  • 【Java】继承
  • 【名单】科大睿智祝贺企业通过DCMM认证最新公示名单
  • 指令集架构(ISA)
  • 教你详细使用Spring框架中编程式事务
  • Vue3 学习笔记(十二)侦听器详解
  • 管家婆财贸ERP BB060.销售订单导入+BB067.销售订单修改BOM类型
  • 期权懂|如何理解Black-Ssholes期权定价模型?
  • 鸿蒙生态的崛起与开发者机遇
  • 3D Gaussian Splatting代码详解(一):模型训练、数据加载
  • C++|运算符优先级
  • Doris集群搭建
  • AI如何提升Web3中的用户体验与数据管理
  • [win] 删除文件空行的方法
  • PPT批量替换字体
  • vue 实现图片预览功能并显示在弹窗的最上方
  • 批发订货系统有哪些功能 b2b网站源码哪里购买靠谱
  • 【测试平台】【前端VUE】工具页面学习记录
  • 当贝Smart1、小明Q3 Pro、大眼橙C1D对比!预算千元,哪款值得买