ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java 反射机制-Reflection

2022-09-01 23:02:31  阅读:247  来源: 互联网

标签:反射 Java Reflection 对象 class 获取 Class


部分内容来自黑马程序员和JavaGuide,可以先了解一下类加载和类加载器的知识

1 反射机制

1.1 【面试】 说说你对反射的了解?

来自文档的解释:

Reflection is a feature in the Java programming language. It allows an executing Java program to examine or "introspect" upon itself, and manipulate internal properties of the program. For example, it's possible for a Java class to obtain the names of all its members and display them.
The ability to examine and manipulate a Java class from within itself may not sound like very much, but in other programming languages this feature simply doesn't exist. For example, there is no way in a Pascal, C, or C++ program to obtain information about the functions defined within that program.
One tangible use of reflection is in JavaBeans, where software components can be manipulated visually via a builder tool. The tool uses reflection to obtain the properties of Java components (classes) as they are dynamically loaded.

简单来说就是:

  • 反射是Java编程语言中的一个特色。
  • 它允许一个正在执行的Java程序来 检验 或者 “反省” 自己,并且操作程序的内部属性。
  • 好比说,一个Java类可以获取它所有成员的名字并进行展示。
  • 这在C、C++、Pascal其他语言里面根本做不到。
  • 反射机制的一个实用例子就是JavaBeans,软件的各个组件可以通过 构建工具来可视化地操作。
  • 这个工具使用反射来获取Java类的属性————当他们被动态地加载时。

  • 这张图就很简单明了:

对于一个未知的对象,我们调用一下反射的API,就可以在运行时修改方法、类、接口的行为。

  • 反射的工作机制:

程序运行时,java 系统会一直对所有对象进行所谓的运行时类型识别,这项信息记录了每个对象所属的类。通过专门的类可以访问这些信息。用来保存这些信息的类是Class类,Class类为编写可动态操纵的Java代码程序提供了强大功能.

  • Class类:

Class类的实例代表一个运行中Java程序的类或接口。枚举是类的一种,注解是接口的一种,每个数组同样也属于一个 被反射为 Class对象的类。Java原始数据类型和void关键字也被视为Class对象。Class类没有公开构造函数,当类被装载,并且在类加载器中被 定义Class 的方法调用时,Class对象会被被JVM自动构建。


综上,总结一下,如果面试时,问你:简单说一下反射机制/反射是什么,你该怎么回答呢?

反射是Java语言中专有的特性。

在Java程序运行时,获取编译以后的类的字节码文件对象,也就是Class类。 (xxx.class字节码文件在读入内存后,类加载器会生成一个java.lang.Class对象,也就是字节码文件对象)。

对于任意一个Class类,都能直接得到这个类的全部部分,包括它的构造器对象、成员变量对象、成员方法对象。

我们把这种 运行时 获取类信息 以及 动态调用类中成分的 能力 称为 Java的反射机制。

1.2 【面试】反射能干什么?

(1) 获取一个类的Class对象 所有行为的第一步

只有我们获取了Class对象后,才能获取其他信息,因为Class对象就像一个入口。在上面类的加载中也说过。反射的第一步,就是拿到这个类对象。
https://blog.csdn.net/liangwenmail/article/details/120965770

  1. 通过类名.class获取,这里的class是Java的关键字。不止对引用类型,基本类型也可以使用。https://www.zhihu.com/question/47002542

  1. Object类的成员方法,被所有类继承:使用对象的getClass()方法,获取对象的类。即使用对象来获取 该对象对应类的Class对象

  2. Class类的静态方法,传入类的全路径:Class.forName("xxx")

首先,Java文件编译得到字节码文件(.class文件),接着回顾我们上面说到的类加载知识。当一个程序使用某个类时,若该类还未被加载到内存中,则会将其.class文件加载到内存中,生成一个对应的java.lang.Class对象。

(2) 获取一个类的构造器对象 Constructor类

Class类提供了以上几种 获取 一个类的 构造器对象 的API。主要区别就是 拿所有还是拿指定(全部返回数组,指定通过参数类型返回单个);拿公开还是公私都拿。
现在我们获取到 一个类的 构造器对象,那肯定可以通过这个构造器来 new 一个该类的对象。

标签:反射,Java,Reflection,对象,class,获取,Class
来源: https://www.cnblogs.com/80sVolxxxx/p/16614522.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有