反射面试题

1. 什么是反射

反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性

反射能做什么

  1. 分析类
    加载并初始化类
    查看类的所有方法和属性
  2. 查看并使用对象
    查看一个类的所有属性和方法
    使用对象的任意方法和属性
    在这里插入图片描述

2. 获取字节码文件的三种方式

类加载器(ClassLoader)

负责将类的字节码文件(.class文件)加载到内存中,并生成对应的Class对象。

Class对象

字节码文件对象,每个Class对象对应一个字节码文件。

一个*.java源文件对应一个*.class字节码文件对应一个Class对象

类的加载时机

1. 创建类的实例

Student s = new Student();  

2. 访问类的静态成员

Calender.getInstance();

3. 初始化类的子类

class User extend Person{}
User u = new User(); //先加载父类

4. 通过反射的方式创建Class对象

Class clazz = Class.forName("类的全限定名");

总结

当你第一次使用类的成员时,类加载器就会将该类的字节码加载到内存中。

获取Class对象的三种方式

1. Object的getClass()方法

Class clazz = 对象名.getClass();

2. 类的静态属性

Class clazz = 类名.class;

3. Class类的静态方法

Class clazz = Class.forName("类的全限定名");

在这里插入图片描述

3. 通过反射的方式获取构造方法并使用

在这里插入图片描述

4. 通过反射的方式获取成员方法并使用

在这里插入图片描述

5. 通过反射的方式获取成员变量并使用

在这里插入图片描述

6. 面试题

6.1 Java反射机制的作用

  1. 在运行时判断任意一个对象所属的类
  2. 在运行时构造任意一个类的对象
  3. 在运行时判断任意一个类所具有的成员变量和方法
  4. 在运行时调用任意一个对象的成员变量和方法

6.2 哪里用到了反射

  1. JDBC中,利用反射动态加载了数据库驱动程序。
  2. 加载src下的配置文件
  3. Eclispe,Idea等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法
    在这里插入图片描述

6.3 反射的优缺点

优点:可以动态执行,在运行期间根据业务功能动态执行方法、访问属性,最大限度发挥了java的灵活性。
缺点:对性能有影响,这类操作总是慢于直接执行java代码。

7. 反射的总体流程

当我们编写完一个Java项目之后,每个java文件都会被编译成一个.class文件。
在这里插入图片描述
这些class文件在程序运行时会被ClassLoader加载到JVM中,当一个类被加载以后,JVM就会在内存中自动产生一个Class对象。
在这里插入图片描述
通过Class对象获取Field/Method/Construcor
在这里插入图片描述
我们一般平时是通过new的形式创建对象实际上就是通过这些Class来创建的,只不过这个class文件是编译的时候就生成的,程序相当于写死了给jvm去跑。
在这里插入图片描述
反射是什么呢?当我们的程序在运行时,需要动态的加载一些类,这些类可能之前用不到,所以没有加载到jvm,而是在运行时根据需要才加载。
原来使用new的时候,需要明确的指定类名,这个时候属于硬编码实现,而在使用反射的时候,可以只传入类名参数,就可以生成对象,降低了耦合性,使得程序更具灵活性。

8. 反射的应用场景

在这里插入图片描述

9. 类加载器的作用与双亲委派机制

10. 反射原理

在这里插入图片描述
首先我们需要了解java程序运行的过程,该过程包含两个阶段编译期和运行期。首先java代码会通过jdk编译成.class字节码文件,程序运行的时候,jvm会去调用业务逻辑对应需要的的字节码文件,生成对应的Class对象,并调用其中的属性方法完成业务逻辑。

而java反射则是在运行期时,主动让jvm去加载某个.class文件生成Class对象,并调用其中的方法属性。
使用反射的一般步骤是获取Class对象;设置属性;最后调用newnstance()调用构造得到实例在这里插入图片描述

视频来源:https://www.bilibili.com/video/BV1Wx411f7qN?p=184&spm_id_from=pageDriver&vd_source=b901ef0e9ed712b24882863596eab0ca
面试题来源:https://www.zhihu.com/search?type=content&q=%E5%8F%8D%E5%B0%84%E9%9D%A2%E8%AF%95%E9%A2%98
反射流程:https://baijiahao.baidu.com/s?id=1720435615570624015&wfr=spider&for=pc
反射原理:https://jingyan.baidu.com/article/a3761b2b79afed5577f9aa43.html

### 关于Java反射的面试题整理 #### 1. **什么是Java反射机制?** Java反射机制是指在程序运行期间,能够动态获取类的信息并操作其属性和方法的能力。通过反射,可以在不知道具体类名的情况下实例化对象、调用方法或访问字段[^3]。 #### 2. **如何使用反射创建对象?** 可以通过`Class.forName()`或者`classLoader.loadClass()`加载类,并使用`newInstance()`方法创建对象。需要注意的是,这种方式可能会抛出异常,因此需要捕获可能发生的`ClassNotFoundException`和`InstantiationException`等[^5]。 ```java Class<?> clazz = Class.forName("com.example.MyClass"); Object obj = clazz.newInstance(); ``` #### 3. **反射的主要应用场景有哪些?** 反射广泛应用于框架开发中,例如Spring框架利用反射实现依赖注入(DI)。其他常见场景还包括动态代理、ORM映射工具(如Hibernate)、单元测试框架(JUnit)以及插件化的系统设计[^1]。 #### 4. **反射的优点是什么?** - 提供了极大的灵活性,能够在运行时决定行为。 - 支持动态加载类,增强了模块间的解耦程度。 然而,也存在性能开销较大、破坏封装性和安全性等问题,需谨慎使用[^3]。 #### 5. **下面这段代码的结果是多少?为什么?** ```java public class ReflectionTest { public static void main(String[] args) throws Exception { Class<?> clazz = Integer.TYPE; System.out.println(clazz.getName()); } } ``` 结果为`int`。因为`Integer.TYPE`返回基本数据类型的表示形式,而这里打印的就是该类型的名字[^4]。 #### 6. **能否通过反射修改final修饰符变量的值?** 理论上可以做到这一点,但强烈反对这样做,因为它违反了语言的设计初衷并且可能导致难以预料的行为。通常涉及设置Field对象的Accessible标志位为true再强行赋新值[^5]。 #### 7. **解释一下Method类的作用及其常用方法。** `java.lang.reflect.Method`代表正在运行的应用程序中的某个类的方法。主要功能包括但不限于: - `invoke(Object obj, Object... args)`:用于执行指定的对象上的此 Method 表示的方法。 - `getModifiers()`:得到方法的修饰符信息。 - `getParameterTypes()`:获得参数列表的数据类型数组[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值