Java 反射相关的面试题

Java 创建对象有几种方式?

  1. new 创建新对象

  2. 通过反射创建对象

  3. 采用 clone 机制

  4. 通过序列化机制

使用 new 关键字
public class MyClass {public MyClass() {System.out.println("MyClass object created!");}
}public class Main {public static void main(String[] args) {MyClass obj = new MyClass();}
}
使用反射

通过 Class 对象的 newInstance 方法或通过构造器对象创建实例。

public class MyClass {public MyClass() {System.out.println("MyClass object created using reflection!");}
}public class Main {public static void main(String[] args) {try {// 使用 Class.forName 获取类对象Class<?> clazz = Class.forName("MyClass");// 创建实例MyClass obj = (MyClass) clazz.getDeclaredConstructor().newInstance();} catch (Exception e) {e.printStackTrace();}}
}
使用 clone 方法

通过实现 Cloneable 接口和覆盖 clone 方法来创建对象的副本。

public class MyClass implements Cloneable {public MyClass() {System.out.println("MyClass object created!");}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}public class Main {public static void main(String[] args) {try {MyClass obj1 = new MyClass();MyClass obj2 = (MyClass) obj1.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}}
}
使用序列化和反序列化

通过将对象序列化到字节流,然后从字节流反序列化回对象。

import java.io.*;public class MyClass implements Serializable {public MyClass() {System.out.println("MyClass object created!");}
}public class Main {public static void main(String[] args) {try {// 序列化对象到文件MyClass obj1 = new MyClass();ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.dat"));oos.writeObject(obj1);oos.close();// 从文件反序列化对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.dat"));MyClass obj2 = (MyClass) ois.readObject();ois.close();} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}

Java 反射的作用与原理

1、定义

反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意个对象,都能够调用它的任意一个方法。在 Java 中,只要给定类的名字,就可以通过反射机制来获得类的所有信息。

这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。

2、哪里会用到反射机制?

反射机制在许多 Java 应用中都有广泛的使用,主要包括以下几种场景:

Spring 框架

Spring 使用反射进行依赖注入(DI)和面向切面编程(AOP)。例如,通过反射来创建和注入 @Autowired 注解标记的依赖。

@Component
public class MyService {@Autowiredprivate MyRepository myRepository;
}

在运行时,Spring 使用反射扫描注解并注入依赖。

动态代理

反射在创建动态代理对象时起到关键作用,特别是在 AOP 和拦截器的实现中。

JDK 动态代理

通过反射创建动态代理对象来拦截方法调用。

InvocationHandler handler = new MyInvocationHandler();
MyInterface proxy = (MyInterface) Proxy.newProxyInstance(MyInterface.class.getClassLoader(),new Class<?>[]{MyInterface.class},handler
);
序列化和反序列化

反射用于序列化和反序列化对象,例如在 JSON 和 XML 解析中。

Jackson 和 Gson

这些库使用反射将 Java 对象转换为 JSON 字符串,或将 JSON 字符串转换为 Java 对象。

ObjectMapper objectMapper = new ObjectMapper();
String jsonString = objectMapper.writeValueAsString(myObject);
MyObject obj = objectMapper.readValue(jsonString, MyObject.class);
测试框架

反射在测试框架中被广泛使用,以便在运行时动态发现和调用测试方法。

JUnit

JUnit 使用反射查找和执行标注了 @Test 的方法。

public class MyTests {@Testpublic void testMethod() {// Test logic}
}
代码生成和分析工具

反射用于生成和分析 Java 代码。例如,通过注解处理器生成代码或通过反射获取类的元数据。

Lombok

Lombok 使用注解处理器和反射生成 getter、setter、构造函数等代码。

@Data
public class MyClass {private String name;
}
配置驱动开发

反射用于根据配置文件动态加载和配置类。例如,读取 XML 或 JSON 配置文件,动态加载相应的类并设置其属性。

public class ConfigLoader {public Object loadConfig(String className, Map<String, String> properties) throws Exception {Class<?> clazz = Class.forName(className);Object obj = clazz.getDeclaredConstructor().newInstance();for (Map.Entry<String, String> entry : properties.entrySet()) {Field field = clazz.getDeclaredField(entry.getKey());field.setAccessible(true);field.set(obj, entry.getValue());}return obj;}
}
3、反射的实现方式

第一步:获取 Class 对象,有 4 种方法

1、Class.forName("类的路径");
2、类名.class
3、对象.getClass()
4、基本类型的包装类,可以调用包装类的 Type 属性来获得该包装类的 Class 对象
4、实现 Java 反射的类

Java 反射机制是通过一组类和接口来实现的,这些类和接口主要位于 java.lang.reflect 包中。以下是一些实现 Java 反射的关键类和接口,以及它们的主要功能:

  1. Class:表示正在运行的 Java 应用程序中的类和接口

注意:所有获取对象的信息都需要 Class 类来实现

  1. Field:提供有关类和接口的属性信息,以及对它的动态访问权限
  2. Constructor:提供关于类的单个构造方法的信息以及它的访问权限
  3. Method:提供类或接口中某个方法的信息
Class

Class 类是反射机制的核心类,表示正在运行的 Java 应用程序中的类和接口。

// 获取类的 Class 对象
Class<?> clazz = MyClass.class;// 通过 Class 对象创建实例
MyClass instance = (MyClass) clazz.getDeclaredConstructor().newInstance();
Method

Method 类表示类或接口的方法,可以用来获取方法的信息和调用方法。

// 获取方法对象
Method method = clazz.getDeclaredMethod("myMethod", String.class);// 调用方法
method.invoke(instance, "Hello, World!");
Field

Field 类表示类或接口的字段,可以用来获取字段的信息和设置字段的值。

// 获取字段对象
Field field = clazz.getDeclaredField("myField");// 设置字段可访问
field.setAccessible(true);// 获取字段值
Object value = field.get(instance);// 设置字段值
field.set(instance, "New Value");
Constructor

Constructor 类表示类的构造函数,可以用来获取构造函数的信息和创建实例。

// 获取构造函数对象
Constructor<?> constructor = clazz.getDeclaredConstructor(String.class);// 创建实例
MyClass anotherInstance = (MyClass) constructor.newInstance("Constructor Argument");
Modifier

Modifier 类提供了一些静态方法和常量,用于解析类和成员的访问修饰符。

// 获取方法的修饰符
int modifiers = method.getModifiers();
boolean isPublic = Modifier.isPublic(modifiers);
Array

Array 类提供了静态方法来动态创建和操作数组。

// 创建数组
Object array = Array.newInstance(String.class, 5);// 设置数组元素
Array.set(array, 0, "Hello");
String value = (String) Array.get(array, 0);
Annotation 接口

Annotation 接口表示注解,反射可以用于获取类、方法、字段上的注解信息。

// 获取类上的注解
Annotation[] annotations = clazz.getAnnotations();// 获取方法上的注解
Annotation[] methodAnnotations = method.getAnnotations();
5、反射机制的优缺点

优点:

1)能够运行时动态获取类的实例,提高灵活性

2)与动态编译结合

缺点:

1)使用反射性能较低,需要解析字节码,将内存中的对象进行解析

2)相对不安全,破坏了封装性(因为通过反射可以获得私有方法和属性)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/43077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

太实用了吧?手把手教你华为eNSP模拟器桥接真实网络!

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 晚上好&#xff0c;我的网工朋友。 今天聊聊eNSP桥接正式网络&#xff0c;就是把eNSP桥接进真实的网络&#xff0c;利用我们的物理网卡通过实体路…

Unity Text Mesh Pro 中英文混编自动换行问题

问题描述 使用TextMeshPro 输入中英文时&#xff0c;在一行内 输入中英文&#xff0c;当英文部分超过第一行剩余位置时&#xff0c;整个英文部分都会自动换行 问题截图&#xff1a; 期待截图&#xff1a; 问题说明 因为 TextMeshPro识别中文后会带换行符。 解决方案 修改…

GEE代码实例教程详解:降水量异常分析

简介 在本篇博客中&#xff0c;我们将通过Google Earth Engine (GEE) 分析特定区域内的降水量异常。利用UCSB-CHG提供的CHIRPS&#xff08;Climate Hazards Group InfraRed Precipitation with Station data&#xff09;数据集&#xff0c;我们可以监测2000年至2020年期间的降…

人员定位系统的功能,你知道多少呢?

在此前的文章中&#xff0c;说到了人员定位系统用于化工厂定位这一用途来完善工厂管理&#xff0c;但同时&#xff0c;基于人员定位系统的强大功能&#xff0c;该系统的应用范围也要宽范的多&#xff0c;那么&#xff0c;本篇文章就来为大家介绍一下吧。 人员定位系统的功能简介…

C++、QT企业管理系统

目录 一、项目介绍 二、项目展示 三、源码获取 一、项目介绍 人事端&#xff1a; 1、【产品中心】产品案列、新闻动态的发布&#xff1b; 2、【员工管理】新增、修改、删除、搜索功能&#xff1b;合同以图片的方式上传 3、【考勤总览】根据日期显示所有员工上班、下班时间…

[每周一更]-(第104期):Go中使用Makefile的经验

文章目录 1. 项目结构2. Makefile的基础知识什么是 Makefile 3. Go项目的Makefile示例4. 详细解释每个Makefile目标5. 使用Makefile执行常见任务 在Go项目中&#xff0c;使用Makefile可以简化和自动化常见的开发和部署任务&#xff0c;如编译、测试、格式化和清理。深入认识及实…

javascript如何实现两个变量值互换

javascript如何实现两个变量值互换。 核心思路是在定义第三个变量 第一个变量值赋值给第三个变量 第二个变量赋值给第一个变量 第三个变量值赋值给第二个变量 代码如下 var a10 var b20 var c ca ab bc

SRS流媒体服务器概述

SRS/5.0(Bee) is a simple, high efficiency and realtime video server, supports RTMP, WebRTC, HLS, HTTP-FLV, SRT, MPEG-DASH and GB28181. 翻译&#xff1a;SRS/5.0(Bee)是一款简洁、高效、实时的视频服务器&#xff0c;支持RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DAS…

Ubuntu开源软件LibreOffice将Excel多表转PDF多目录示例

一、实现的起因&#xff1a; Windows平台下&#xff0c;常见的WPS办公自动化套件中电子表格软件&#xff0c;其中具备将Excel工作表中数据转为PDF文档表格的功能。现在进一步的需求是&#xff1a;像PDF标准的电子书那样&#xff0c;具备一本书的目录结构或章节结构&#xff0c…

怎么才能选到好的猫咪主食冻干?公认顶尖优秀主食冻干总结

如今&#xff0c;主食冻干市场纷繁多样&#xff0c;质量水平却大相径庭。部分品牌盲目追求高营养值和利润增长&#xff0c;却忽略了猫咪健康饮食的本质需求&#xff0c;导致市场上充斥着以次充好、虚假标注日期等不法行为。更有甚者&#xff0c;部分产品未经权威第三方检测便匆…

vue安装总是失败原因剖析

今天要用vue2的环境开发&#xff0c;当前环境是vue3。 错误尝试&#xff1a; 直接在应用里面卸载nodejs&#xff0c;然后安装新的nodejs。这样做会出现node与npm都安装成功&#xff0c;但是vue怎么都安装不成功。这时我还怀疑是环境变量等的问题&#xff0c;结果设置完还是不起…

Docker——简介、安装(Ubuntu22.04)

1、简介 Docker 是一个开源的容器化平台&#xff0c;旨在简化应用程序的开发、交付和运行。它通过将应用程序及其所有依赖项打包到一个称为容器的标准化单元中&#xff0c;使应用程序能够在任何环境中一致地运行。Docker 解决了“在我的机器上能运行”的问题&#xff0c;使开发…

【AI大模型】跌倒监控与健康:技术实践及如何改变未来

文章目录 1. **背景与意义**2. **关键技术与方法**2.1 传感器数据融合2.2 深度学习模型2.3 行为模式识别2.4 预测与预防 3. **应用场景**3.1 老年人跌倒预警3.2 康复患者监测3.3 高风险职业防护 4. **实践案例**案例1&#xff1a;某老年社区的跌倒预警系统案例2&#xff1a;康复…

Redis存储原理与数据模型

Redis存储结构 存储转换 redis-value编码 string int&#xff1a;字符串长度小于等于20切能转成整数raw&#xff1a;字符串长度大于44embstr&#xff1a;字符串长度小于等于44 list quicklist&#xff08;双向链表&#xff09;ziplist&#xff08;压缩链表&#xff09; hash …

意得辑ABSJU202优惠15%啦,新用户注册直减哦

不得不说&#xff0c;还得是意得辑&#xff0c;钱不白花&#xff0c;润色的挺好~ 第一篇SCI终于成功见刊&#xff01;&#xff01;&#xff01; 都来接accept&#xff01;&#xff01;&#xff01;谢谢accept小狗&#xff0c;接accept 求求accept小狗&#xff0c;真的想要双证毕…

站常用金属材料检测试题

一、单选题 1.正火采用的哪一种冷却方式( ) A.风冷 B.炉冷 C.油冷 D.空冷 参考答案:D 2.哪个合金属于弹簧钢?( ) A.20Cr B.9SiCr C.65Mn D.W18Cr4V 参考答案:C 3.T8A是什么工具钢?( ) A.碳素工具钢 B

OS-HACKNOS-2.1

确定靶机IP地址 扫描靶机开放端口信息 目录扫描 访问后发现个邮箱地址 尝试爆破二级目录 确定为wordpress站 利用wpscan进行漏洞扫描 #扫描所有插件 wpscan --url http://192.168.0.2/tsweb -e ap 发现存在漏洞插件 cat /usr/share/exploitdb/exploits/php/webapps/46537.txt…

关于QFontMetrics的使用时机

QFontMetrics 是一个非常有用的类&#xff0c;用于测量字体的各种属性&#xff0c;如文本的宽度、高度以及字符的尺寸等。它在 Qt 中的许多场景下都非常有用&#xff0c;特别 是在需要精确控制文本布局和绘制的情况下。以下是一些 QFontMetrics 最常用的时机&#xff1a; 1. …

location匹配和rewrite重定向

目录 location 匹配 location匹配的分类和优先级 优先级细分 实际网站中的使用规则 1.用精确匹配来实现网站的首页 访问网站的首页 &#xff08; /&#xff09; 2.用正则匹配来实现静态请求的页面和图片 匹配静态页面 访问图片或者指定的后缀名 3.用一般匹配转发.php…

树状数组

树状数组 树状数组的核心思想&#xff1a;分治。将数组以二叉树的形式进行维护区间之和。 设 a a a为原数组&#xff0c; t r e e tree tree为树状数组。 t r e e tree tree数组用于存储树上该结点下严格直连的子节点之和(例&#xff1a; t [ 1 ] a [ 1 ] , t [ 2 ] t [ 1 …