有反射就有正射

直接new对象就叫正射

如下

Map<String, String> map = new HashMap<>();
map.put("蔡徐鸡","唱跳rap篮球");

那反射是啥?我先不说反射是啥,概念啥的太虚幻我就不说了,把你绕蒙你这篇文章就白看了,直接举例吧

接着看上面的正射,如果哪天你发现用LinkedHashMap效果更好,然后你噗呲噗呲修改代码

Map<String, String> map = new LinkedHashMap<>();
map.put("蔡徐鸡","唱跳rap篮球");

改完了编译运行没有bug,漂亮,老板可以上线了,噗呲噗呲打包上线;然而过了两天你发现用LinkedHashMap会有隐患,还是得改回去用HashMap,成年人的崩溃如此简单,但是聪明的你想到可以加个判断,根据传入的条件来决定用HashMap还是LinkedHashMap,于是…

public Map<String, String> getMap(String param) {Map<String, String> map = null;if (param.equals("HashMap")) {map = new HashMap<>();} else if (param.equals("LinkedHashMap")) {map = new LinkedHashMap<>();}return map;}

大功告成,这么难的逻辑都被你实现了,你现在很膨胀,甚至内心隐隐觉得这破公司已经容不下你这尊大佛了

但是某天老大看了你的代码说:小张啊,这里你得用TreeMap;你又要噗呲噗呲改代码,哦豁

------------------------------------------------------正经的分割线------------------------------------------------------

有没有一种办法可以让你不修改代码呢,of course、sure、必须~~滴

这时候反射就派上用场了

概念:反射是Java的一种机制,让我们可以在运行时获取类的信息

作用:通过反射,我们可以在程序运行时动态创建对象,还能获取到类的所有信息,比如它的属性、构造器、方法、注解等;

直接举例吧

public Map<String, String> getMap(String className) {Class clazz = Class.forName(className);Constructor constructor = clazz.getConstructor();return (Map<String, String>) constructor.newInstance();
}

这时候不管你需要什么Map,只要实现了Map接口,你都能通过getMap获得,只需要传入对应Map的全限定名,例如java.util.HashMap / java.util.LinkedHashMap

懂了没,我问你懂了没,没懂的下面留言

------------------------------------------------------不正经的分割线------------------------------------------------------

java中反射的用法非常非常多,常见的有以下这几个:

一、在运行时获取一个类的 Class 对象
二、在运行时构造一个类的实例化对象
三、在运行时获取一个类的所有信息:变量、方法、构造器、注解

一、获取class对象
三种方法
1、类名.class:这种获取方式只有在编译前已经声明了该类的类型才能获取到 Class 对象

Class<HashMap> hashMap= HashMap.class;

2、实例.getClass():通过实例化对象获取该实例的 Class 对象

Map<String, String> hashMap = new HashMap<>();
Class<? extends Map> hashMapClass = hashMap.getClass();

3、Class.forName(“类的全限定名”):通过类的全限定名获取该类的 Class 对象

Class<?> hashMap= Class.forName("java.util.HashMap");

拿到 Class对象就可以对它为所欲为了:调用它的方法、获取属性、获取类信息,总之它在你面前就没有隐私了,好羞羞,嘤~。

二、构造类的实例化对象
通过反射构造一个类的实例方式有2种:
1、Class 对象调用newInstance()方法

Class<?> hashMapClass = Class.forName("java.util.HashMap");
HashMap hashMapInstance = (HashMap) hashMapClass.newInstance();

注意:即使 HashMap已经显式定义了构造方法,通过 newInstance() 创建的实例中,所有属性值都是对应类型的初始值,因为 newInstance() 构造实例会调用默认无参构造器。

2、Constructor 构造器调用newInstance()方法

Class<?> hashMapClass = Class.forName("java.util.HashMap");
Constructor<?> constructor = hashMapClass.getConstructor();
constructor.setAccessible(true);
HashMap newInstance = (HashMap) constructor.newInstance();

通过 getConstructor(Object… paramTypes) 方法指定获取指定参数类型的 Constructor, Constructor 调用 newInstance(Object… paramValues) 时传入构造方法参数的值,同样可以构造一个实例,且内部属性已经被赋值。

通过Class对象调用 newInstance() 会走默认无参构造方法,如果想通过显式构造方法构造实例,需要提前从Class中调用getConstructor()方法获取对应的构造器,通过构造器去实例化对象。

三、获取类的所有信息

1、获取类中的变量(Field)

Field[] getFields():获取类中所有被public修饰的所有变量 Field getField(String
name):根据变量名获取类中的一个变量,该变量必须被public修饰 Field[]
getDeclaredFields():获取类中所有的变量,但无法获取继承下来的变量 Field
getDeclaredField(String name):根据姓名获取类中的某个变量,无法获取继承下来的变量

2、获取类中的方法(Method)

Method[] getMethods():获取类中被public修饰的所有方法
Method getMethod(String name, Class…<?>
paramTypes):根据名字和参数类型获取对应方法,该方法必须被public修饰
Method[] getDeclaredMethods():获取所有方法,但无法获取继承下来的方法
Method getDeclaredMethod(String name, Class…<?>
paramTypes):根据名字和参数类型获取对应方法,无法获取继承下来的方法

3、获取类的构造器(Constructor)

Constuctor[] getConstructors():获取类中所有被public修饰的构造器 Constructor
getConstructor(Class…<?> paramTypes):根据参数类型获取类中某个构造器,该构造器必须被public修饰
Constructor[] getDeclaredConstructors():获取类中所有构造器 Constructor
getDeclaredConstructor(class…<?> paramTypes):根据参数类型获取对应的构造器

反射的应用场景

1、Spring 实例化对象:当程序启动时,Spring 会读取配置文件applicationContext.xml并解析出里面所有的标签实例化到IOC容器中。
2、反射 + 工厂模式:通过反射消除工厂中的多个分支,如果需要生产新的类,无需关注工厂类,工厂类可以应对各种新增的类,反射可以使得程序更加健壮。
3、JDBC连接数据库:使用JDBC连接数据库时,指定连接数据库的驱动类时用到反射加载驱动类


良心建议,家里有条件的同学都把文中代码在自己idea上跑一跑,真正用过以后面试官问到你才有底气

嘤~

ok我话说完

信不信十分钟让你彻底搞懂java反射相关推荐

  1. 彻底搞懂java反射技术及其原理

    概述:反射是java中最强大的技术之一,很多高级框架都用到了反射技术,面试中也是经常问的点,所以搞懂反射非常重要! 文章目录 1.反射是什么? 2.反射的底层原理 3.三种方式获取Class对象 4. ...

  2. 原码一位乘法器设计_十分钟带你彻底搞懂原码、反码、补码

    点击上方"程序员大白",选择"星标"公众号 重磅干货,第一时间送达 编辑 | 程序员大白公众号来源丨https://www.cnblogs.com/zhangz ...

  3. 泛型类有什么作用_3 分钟带你彻底搞懂 Java 泛型背后的秘密

    优质文章,及时送达 作者 | 的一幕 来源 | www.jianshu.com/p/dd34211f2565 这一节主要讲的内容是java中泛型的应用,通过该篇让大家更好地理解泛型,以及面试中经常说的 ...

  4. (SQL入门详解)每天十分钟。10天搞定SQL

    每天十分钟.10天搞定SQL 第一章 SQL 语言的入门 前言 鉴于本猿往日学习SQL语言时,老是因为各种功能SQL的不集中,而导致打开各种网络页面,晕头转向,所以在老长时间的学习之后,终于是总结出来 ...

  5. 10分钟带你彻底搞懂微内核架构

    文章目录 十分钟搞懂系列 什么是微内核架构? 如何实现微内核架构? 总结 十分钟搞懂系列 序号 标题 链接 1 10分钟带你彻底搞懂企业服务总线 https://blog.csdn.net/belon ...

  6. 10分钟带你彻底搞懂服务限流和服务降级

    文章目录 十分钟搞懂系列 服务限流 计数器法 滑动窗口法 漏桶算法 令牌桶算法 服务降级 十分钟搞懂系列 序号 标题 链接 1 10分钟带你彻底搞懂企业服务总线 https://blog.csdn.n ...

  7. 10分钟带你彻底搞懂负载均衡

    文章目录 十分钟搞懂系列 负载均衡是如何保证软件系统的生产部署的? 负载均衡分发策略 请求由谁来分发? 服务器端负载均衡器 客户端负载均衡 请求分发到哪去? 静态负载均衡算法 动态负载均衡算法 十分钟 ...

  8. 8分钟带你深入浅出搞懂Nginx

    8分钟带你深入浅出搞懂Nginx Nginx是一款轻量级的Web服务器.反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用. 架构图 上图基本上说明了当下流行的技术架构 ...

  9. JVM - 结合代码示例彻底搞懂Java内存区域_对象在堆-栈-方法区(元空间)之间的关系

    文章目录 Pre 示例demo 总体关系 代码示例论证 反汇编 Pre JVM - 结合代码示例彻底搞懂Java内存区域_线程栈 | 本地方法栈 | 程序计数器 中我们探讨了线程栈中的内部结构 ,大家 ...

最新文章

  1. latex中插入visio矢量图的方法
  2. numpy.array创建行数超过一行的矩阵为什么要用两层中括号?
  3. php nl2br() 函数
  4. 全端开发——html简介与常用标签
  5. android jni jstring 转 char*
  6. 9读书1-我在义务发财(1)
  7. 复杂性思维中文第二版 附录 A、算法分析
  8. 开源http协议库curl和wget的区别和使用
  9. python已知有列表_python 列表常用方法
  10. iPhone黑屏幕转圈圈(解决办法)
  11. 基于python+Django+MYSQL实现的图书管理系统
  12. sql server2000的1433端口不通怎么办
  13. 2022最新前端vue面试题
  14. Win11怎么进行屏幕休眠时间的设置
  15. html中写jq,在jQuery中,能够操作HTML代码及其文本的方法是()
  16. 配对交易(一):期货品种相关性研究
  17. 国际象棋绘制java_java使用swing绘制国际象棋棋盘
  18. 如何在 R 中应用经验法则
  19. html5核显加速,英伟达:用GTX 16系列显卡加速,视频编辑速度达核显8倍
  20. 国家知识产权局一行走访易保全调研区块链,提升相关专利审查工作质效

热门文章

  1. 什么叫磁路、磁场、磁感应强度、磁力线?
  2. luogu 3618 误会 关于字符串Hash
  3. 学计算机女生笔记本电脑推荐,适合女生用的笔记本电脑 推荐详情
  4. Norbornene-PEG5k-FITC溶于大部分有机溶剂,降冰片烯PEG荧光素
  5. css修改el-button的默认样式
  6. python知乎首页文章数据爬取
  7. 深入篇【C++】类与对象:友元函数与友元类
  8. 还有谁比阿里人更懂Spring Cloud Alibaba 呢?阿里P8纯手打笔记 本网站收藏已过W
  9. 家常六菜一汤(蒜薹肉丝、凉拌黄瓜丝、红烧猪蹄、酸辣白菜、烤鸡翅、清蒸鲈鱼和鱼头豆腐汤)...
  10. [转贴]史上最牛女秘书