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

Java中的反射机制

目录

一.概述

二.反射机制的实现原理

1.Class类(根基)

三中创建Class对象的方法:

1.已知类的字符串地址(框架自动映射参数的原理)

2.类名.class(Mybatis创建Class对象的原理)

3.对象名.class(将一个对象转json格式的原理)

三.模拟Mybatis查询后,自动数据封装

四.反射机制的优缺点

1.优点

2.缺点


一.概述

        Java反射机制是运行状态中的,对任意一个类,都能知道这个类所有的属性和方法

核心原理:java.lang.Class类

        一个Class对象表示一个正在运行时的类,我们可以通过Class类中提供的方法,拿到类中的所有的属性和方法(包括私有的),并创建类的对象,所以Class类时java反射机制的根基,一旦.class文件被加载到内存中,就会为其创建(有且仅有)一个Class对象,任何类被使用时都会创建一个Class对象

二.反射机制的实现原理

首先反射机制的实现离不开java提供的三个类:

1.Class类(根基)

Class类中提供了很多方法,可以让我们获取类中的属性和方法

三中创建Class对象的方法:

1.已知类的字符串地址(框架自动映射参数的原理)
String className = "包名.类名";
Class c = Class.forName(className);
2.类名.class(Mybatis创建Class对象的原理)
Class c = 类名.class;
3.对象名.class(将一个对象转json格式的原理)
Class c = 对象名.class;

class.forName(类地址)方法:通过类地址返回一个Class对象

newInstannce:创建对象,返回值Object类型

getFieldS():拿到所有的属性(不包括私有的),返回值是Field数组

getDeclaredFields():拿到所有的属性(包括私有的属性),返回值是Field数组

getMethods():拿到所有的方法(不包括私有的),返回值是Mehod数组

getDeclaredMethods():拿到所有的方法(包括私有的),返回值是Mehod数组

三.模拟Mybatis查询后,自动数据封装

这里详细介绍一下Mybatis自动映射以及Spring自动管理对象如何实现根据不同的类返回相应的对象,利用了泛型<T>实现,不指定返回值类型

  • 返回值是 T,调用时写出目标类型,编译器就按该类型推断并检查
  • “编译期根据参数推断 T 的具体类型”,并没有实际转换
public static <T> T putData(String className, Map<String,Object> map) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {//获得传入的类地址的CLass对象Class c = Class.forName(className);System.out.println(c.getTypeName());//创建一个传入类的对象T o = (T) c.newInstance();//动态获得类中的属性Field[] fileds = c.getDeclaredFields();//赋值for (Field field:fileds){//获得属性的名字String name = field.getName();//通过属性的名字找到对应的set方法名,将第一个字母转为大写String methodName = "set"+(char)(name.charAt(0)-32)+name.substring(1);//通过名字,获得方法对象Method setMethod = c.getMethod(methodName,field.getType());//从map取数据赋值setMethod.invoke(o,map.get(name));}return o;}

四.反射机制的优缺点

1.优点

通过反射机制可以动态调用任意类中的信息,对象中的方法,增加了程序的复用性和灵活性,例如框架,写一套可以处理任意类

2.缺点

使用反射机制效率低,可以对私有成员操作,打破了封装性,安全性低,在使用反射机制时,应该避免直接对私有成员操作

http://www.xdnf.cn/news/18675.html

相关文章:

  • MyBatis 从入门到精通:一篇就够的实战指南(Java)
  • 3-3〔OSCP ◈ 研记〕❘ WEB应用攻击▸WEB应用安全评估工具
  • 火山引擎配置CDN
  • 【Linux | 网络】多路转接IO之poll
  • 计算机网络课堂笔记
  • AutoCAD Electrical缺少驱动程序“AceRedist“解决方法
  • C++ Core Guidelines 核心理念
  • 关于单片机串口通讯的多机操作说明---单片机串口通讯如何实现多机操作?
  • 16-day13强化学习和训练大模型
  • 怎么把iphone文件传输到windows电脑?分场景选方法
  • jasperreports 使用
  • 解锁处暑健康生活
  • 企业级监控可视化系统 Prometheus + Grafana
  • LoRA(低秩适应,Low-Rank Adaptation)的 alpha 参数解析(54)
  • 雷卯针对香橙派Orange 4G-IOT开发板防雷防静电方案
  • kafka 原理详解
  • 【OpenAI】ChatGPT-4o-latest 真正的多模态、长文本模型的详细介绍+API的使用教程!
  • 深入理解 Python Scapy 库:网络安全与协议分析的瑞士军刀
  • ES6/ES2015 - ES16/ES2025
  • 在压力测试中如何确定合适的并发用户数?
  • 挖币与区块链技术有怎样的联系?
  • 基于 Prometheus+Alertmanager+Grafana 打造监控报警后台(一)-Prometheus介绍及安装
  • DMP-Net:面向脑组织术中成像的深度语义先验压缩光谱重建方法|文献速递-深度学习人工智能医疗图像
  • PyTorch实战(1)——深度学习概述
  • 阿里:基于设计逻辑的LLM数据合成
  • crc16是什么算法
  • C++ 指针与引用面试深度解析
  • STM32项目分享:基于STM32的智能洗衣机
  • 开源大模型天花板?DeepSeek-V3 6710亿参数MoE架构深度拆解
  • 微软恶意软件删除工具:官方免费的系统安全防护利器