反射面试题

本文探讨Java反射机制,介绍如何在运行时操作类和对象,同时剖析序列化的重要性及其应用场景。随后讲解动态代理的概念,包括其在Spring AOP中的运用,以及如何通过InvocationHandler实现动态代理的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

什么是反射?

Java反射?

什么是java序列化?什么时候需要java序列化?

动态代理是什么?有哪些应用?

怎么实现动态代理?


什么是反射?

  • 反射是指程序可以访问、检测、修改本身状态或行为的一种能力。

Java反射?

  • 在运行时判断任意一个对象所属的类。
  • 在运行时创建任意一个类的实例对象。
  • 在运行时判断任意一个类所具有的成员变量和方法。
  • 在运行时调用任意一个对象的方法。

什么是java序列化?什么时候需要java序列化?

序列化是java提供的一种机制 ,能在内存中保存各种对象的状态,并且可以把保存对象的状态再读出来。

什么时候需要序列化:

  • 当你想把内存中的对象状态保存到一个文件中或者数据库的时候。
  • 当你想用套接字在网络上传送对象的时候。

动态代理是什么?有哪些应用?

动态代理:

当你想要给实现了某个类中的方法,加一些额外的功能。比如说加日志,加事务等。可以给这个类创建一个代理。也就是创建一个新类,这个类不仅包含原来类方法的功能,而且还在原来类的基础上添加了额外处理的新类。这个类不是我们自己定义的,是动态生成的。这就是动态代理。

动态代理的应用:

  • spring的AOP
  • 加事务
  • 加权限
  • 加日志

怎么实现动态代理?

  • 定义一个接口
  • 一个InvocationHandler处理类,将实现接口的类的对象传递给它
  • 一个工具类Proxy,习惯性的称它为代理类,因为调用它的newInstance()可以产生代理对象,其实它就是一个产生代理对象的工具类
  • 利用InvocationHandler,拼接代理类源码,将其编译生成代理类的二进制码,利用加载器加载,并将其实例化生成代理对象,最后返回。

### 关于Java反射的面试题目及答案 #### Java反射的概念及其用途 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制[^1]。 ```java // 获取Class实例的方式之一:通过类名.class获得 Class<?> clazz = String.class; ``` #### 如何创建指定类型的对象? 可以通过`Class.forName()`加载某个类并返回该类对应的`Class`对象,再利用此对象的`newInstance()`方法来创建一个新的实例。需要注意的是,在较新的JDK版本里推荐使用`Constructor.newInstance()`替代之以提高灵活性和安全性[^2]。 ```java // 使用Constructor创建对象示例 Class<?> personClazz = Class.forName("com.example.Person"); Constructor<?> constructor = personClazz.getConstructor(String.class); Object obj = constructor.newInstance("John Doe"); ``` #### 访问私有成员变量或方法 即使字段或者方法被声明为private访问级别,也可以借助setAccessible(true)绕过Java的安全检查直接操作它们。不过这样做可能违反封装原则,并且在某些安全策略下可能会失败[^3]。 ```java Field privateStringField = MyClass.class.getDeclaredField("myPrivateField"); privateStringField.setAccessible(true); // 设置可访问标志位 privateStringField.set(myInstance, "new value"); // 修改私有属性值 ``` #### 性能影响 频繁地使用反射会带来一定的性能开销,因为每次都需要解析字节码文件中的元数据信息。因此建议仅当确实有必要时才考虑采用这种方式编程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值