面试官:直接 new 对象不行吗,为何用反射?

​ new 是静态编译,只能用于编译期就能确定的类型, 而反射可以在运行时才确定类型并创建其对象。Java的反射机制就是动态编译,增加程序的灵活性,解耦。

​ 具体来说就是静态编译是在编译的时候把你所有的模块都编译到程序中,当你启动这个程序的时候所有模块都加载进来了。当程序比较大时,加载的过程(就是当你运行程序时初始化的过程)就比较慢了。动态编译就不一样了,你编译的时候那些模块都没有编译进去,一般情况下你可以把那些模块都编译成dll,这样你启动程序(初始化)的时候这些模块不会被加载,而是在运行的时候,用到那个模块就调用哪个模块。

​ 比如:Spring中的 IOC(工厂模式)

https://blog.csdn.net/a745233700/article/details/82893076
分别说说 使用new创建对象 和 通过反射创建对象 的区别,优劣势?

什么是反射

反射就是把 Java 类中的各种成分映射成一个个的 Java 对象。

​ Java反射机制的本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。其核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。

和 new 创建对象 的区别

https://www.cnblogs.com/jiazhutao/p/12447385.html

​ (1)new只有在知道类名之后才能new,而反射有时候不需要。

知道类名的情况:

Class<?> c1 = Class.forName(“cn.classes.OneClass”);
Class<?> c2 = new OneClass.getClass();
Class<?> c3 = OneClass.class();

不知道类名的情况:

​ 首先jvm在其内部通过函数ProxyGenerator.generateProxyClass()方法来生成代理对象的字节码文件(其实 就没有具体文件,一切都是在内存中,暂时就这么叫吧),然后defineClass0()函数利用之前生成的二进制字节码文件来创建类Class对象,并顺便为代理类命名(proxyName是在字节码文件生成之前自己命名的),经过这个过程我们就可以在不知道类名的情况下得到了类Class对象了,然后就可以使用反射来获取对象实例了(这其中牵扯到类加载的加载过程

​ (2)new出来的对象中,我们是无法反问她的私有属性,而反射可以(通过setAccessible()取访问)

​ (3)new属于静态编译,而反射属于动态编译。静态编译就是在编译的时候把你所有的模块都编译进exe里去,当你启动这个exe的时候所有模块都加载进来了。当程序比较大时,加载的过程(就是当你运行程序时初始化的过程)就比较费力了。动态编译就不一样了,你编译的时候那些模块都没有编译进去,一般情况下你可以把那些模块都编译成dll,这样你启动程序(初始化)的时候这些模块不会被加载,而是在运行的时候,用到那个模块就调用哪个模块。

优缺点

​ 优点:

​ 在运行时获得类的各种内容,进行反编译,对于Java这种先编译再运行的语言,能够让我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象。

​ 缺点:

​ (1)反射会消耗一定的系统资源,且性能低。

​ (2)反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。

用途

​ (1)反编译:.class ——> .java

​ (2)通过反射机制访问java对象的属性,方法,构造方法等

​ (3)当我们在使用IDE,比如Ecplise,IDEA时,当我们输入一个对象或者类,并想调用他的属性和方法是,一按点号,编译器就会自动列出他的属性或者方法,这里就是用到反射。

​ (4)反射最重要的用途就是开发各种通用框架。比如很多框架(Spring)都是配置化的(比如通过XML/YML文件配置Bean),为了保证框架的通用性,他们可能需要根据配置文件加载不同的类或者对象,调用不同的方法,这个时候就必须使用到反射了,运行时动态加载需要的加载的对象。

​ (4)* 加载数据库驱动的,用到的也是反射。Class.forName(“com.mysql.jdbc.Driver”);

这些博客确实不错:

程序人生:学Java反射,看这篇就够了 | 原力计划

架构师社区:Java 反射:框架设计的灵魂

业余草:面试官:什么是Java反射?它的应用场景有哪些?

Java技术栈:Java反射是什么?看这篇绝对会了!

Java技术栈:Java 反射,这篇写的很透彻!

Java面试:反射机制相关推荐

  1. Java的反射机制 工厂模式综合讲解【转载自51CTO】

    2019独角兽企业重金招聘Python工程师标准>>> Java的反射机制 工厂模式综合讲解 1.什么叫反射 Java.lang.reflect包下 正常情况下我们可以通过类实例化一 ...

  2. java xml 反射_Java 读取XML文件以及Java 的反射机制实现

    Java 读取XML文件以及Java 的反射机制实现 代码部分 import java.io.File; import javax.xml.parsers.DocumentBuilder; impor ...

  3. Java编程:Java的反射机制中的 getComponentType() 方法

    转载自  Java编程:Java的反射机制中的 getComponentType() 方法 Java 中所有的类都继承自 Object,数组本身也是一个 Class,如果我们能够得到数据的 Class ...

  4. 搞懂Java的反射机制

    搞懂Java的反射机制 1.什么是反射? java的反射机制是指可以在运行状态下获取类和对象的所有属性和方法. 2.反射的作用? 1.在运行时获取一个类/对象的成员变量和方法 2.在运行时创建一个类的 ...

  5. java原理—反射机制

    http://www.cnblogs.com/forlina/archive/2011/06/21/2085849.html 一.什么是反射: 反射的概念是由Smith在1982年首次提出的,主要是指 ...

  6. java反射之获取class对象,Java之反射机制(获取Class对象的三种方式)

    Java之反射机制(获取Class对象的三种方式) 开发工具与关键技术:MyEclipse 10,java 作者:刘东标 撰写时间:2019-06-14 如何得到各个字节码对应的实例对象? 每个类被加 ...

  7. 学习:java原理—反射机制

    一.什么是反射: 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提 出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...

  8. Java —— Reflect反射机制

    JAVA反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java的反射机制. ...

  9. 什么是Java的反射机制

    Java反射机制是Java的特点,是框架实现的基础,百度结果: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这 ...

  10. 什么是Java的反射机制?

    Java 的反射机制是使其具有动态特性的非常关键的一种机制,也是在JavaBean 中广泛应用的一种特性. 运用JavaBean 的最常见的问题是:根据指定的类名,类字段名和所对应的数据,得到该类的实 ...

最新文章

  1. vim 下的 ex 指令(底行命令模式下)
  2. 马约拉纳费米子:推动量子计算的“天使粒子”
  3. 前端学习(1909)vue之电商管理系统电商系统之渲染修改用户的请求
  4. react优秀项目案例_关于进行2019年北京市高等学校“实培计划”项目——毕业设计(创业类)项目总结与优秀项目案例征集的通知...
  5. angularjs中ui-sref传值步骤
  6. Dive into Python
  7. 【uoj#180】[UR #12]实验室外的攻防战 结论题+树状数组
  8. CCF NOI1140 高精度乘法
  9. 快速生成大量测试数据
  10. 计算机全息图的制作与在线,基于Matlab的计算全息图的制作与数字再现的研究精选.doc...
  11. 十大热门编程语言的介绍
  12. STM32官方USB库下载指南
  13. gb28181简单实现sip信令服务器(java版基于springboot):二、sip摄像头注册(信令解读)
  14. 通感一体化学习笔记(1)——匹配滤波与脉冲压缩
  15. 景联文科技为自动驾驶DMS系统提供数据采集标注服务
  16. 第46届EC-Final总结
  17. 尚硅谷大厂面试题第二季周阳主讲整理笔记【涨薪必看】
  18. 爬虫系列之爬取1688
  19. Oracle Newsletter闪亮人物推介--Joel Perez
  20. 点积、内积、外积、叉积、张量积——概念区分

热门文章

  1. gba模拟器html5源码,酷!用 JS 做的 GBA 模拟器
  2. 2022 年移动应用开发终极指南
  3. 计算机技术与课堂教学整合,浅谈信息技术与课堂教学深度融合
  4. HTML5+js+css3开心消消乐手机pc端通用源码|H5小游戏
  5. C语言小案例_OA大典故障案例摘录【第1393篇】爱普生c5290 彩色喷墨打印机 打印横白道...
  6. JavaWeb快速入门(一)——新建JavaWeb项目
  7. 规约转换装置的一些概念
  8. 查看微信公众号文章发布时间
  9. 【机器学习数学基础】Mathematics for Machine Learning 梳理+习题答案
  10. 简单的三步教你下载PyCharm汉化插件,让你学习Python事功半倍