JAVA小白不得不知道的50个面试题(含答案)——第四篇
文章目录
前言
问题涵盖了Java基础知识、面向对象编程、集合、多线程、异常处理、泛型、反射、JDBC、JVM以及设计模式等方面。
七、Java反射
1.什么是Java反射?它有哪些用途?
Java反射是Java编程语言的一个特性,它允许程序在运行时(runtime)检查类、接口、字段和方法的信息,并且可以动态地调用它们。反射API主要包含在java.lang.reflect
包中。
2. 反射的用途
- 动态加载类:当你不确定某个类的全限定名时,可以使用反射来动态加载它。
- 调用动态方法:可以调用某个对象上未知的方法,只需要知道方法名和参数类型。
- 访问私有成员:尽管通常不推荐这样做,但反射可以访问类的私有成员。
- 框架和库:许多框架和库(如Spring、Hibernate等)使用反射来提供灵活性和动态行为。
- 测试:在单元测试中,反射可以用来模拟私有方法或访问内部状态。
2. 获取一个类的Class对象
有几种方法可以获取一个类的Class
对象:
-
使用
.class
语法:Class<?> clazz = String.class;
-
使用对象的
getClass()
方法:String str = "hello"; Class<?> clazz = str.getClass();
-
使用
Class.forName()
(通常用于动态加载类):try { Class<?> clazz = Class.forName("java.lang.String"); } catch (ClassNotFoundException e) { e.printStackTrace(); }
4. 通过反射调用类的方法
以下是通过反射调用类方法的步骤:
- 获取
Class
对象。 - 使用
getMethod()
或getDeclaredMethod()
获取Method
对象(对于公有方法和私有方法)。 - 使用
Method.invoke()
调用方法。
示例:
try {
Class<?> clazz = String.class;
Method method = clazz.getMethod("substring", int.class, int.class); // 获取substring方法
String str = "hello";
Object result = method.invoke(str, 1, 4); // 调用substring方法并传递参数
System.out.println(result); // 输出 "ell"
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
5. 反射的优缺点
优点:
- 灵活性:可以在运行时动态地调用方法、访问属性等。
- 可扩展性:为框架和库提供了强大的功能,如依赖注入、ORM等。
缺点:
- 性能:反射操作通常比直接调用方法或访问字段要慢。
- 安全性:允许访问私有成员可能破坏封装性,并可能导致意外的副作用。
- 代码清晰度:使用反射的代码通常比直接调用更难理解和维护。
- 依赖性问题:反射依赖于字符串(方法名、类名等),这可能导致运行时错误(如拼写错误)。
因此,在决定使用反射之前,应该仔细权衡其优缺点,并确保代码的安全性、可读性和性能。
八、JDBC
1.JDBC是什么
JDBC(Java Database Connectivity)称为Java数据库连接,是一种用于执行SQL语句的Java API,由一组用Java语言编写的类和接口组成。JDBC为多种关系数据库提供统一访问,可以消除因各种数据库操作语言的差异而导致的复杂编程工作。
2.JDBC的工作原理
JDBC的工作原理主要包括以下步骤:
- 加载数据库驱动程序:首先,需要加载与数据库相对应的JDBC驱动程序。这通常通过将驱动程序的JAR文件添加到项目的类路径中,并在代码中使用
Class.forName()
方法来加载驱动程序完成。 - 建立数据库连接:使用
DriverManager
类来连接数据库。通过调用DriverManager.getConnection()
方法,并传入数据库URL、用户名和密码作为参数,可以获取一个数据库连接对象。 - 执行SQL语句:连接成功后,可以通过
Connection
对象创建Statement
或PreparedStatement
对象来执行SQL语句。Statement
用于执行静态SQL语句,而PreparedStatement
则支持动态SQL语句,并可以防止SQL注入攻击。
3.如何使用JDBC连接数据库?
使用JDBC连接数据库通常包括以下步骤:
- 加载数据库驱动程序。
- 使用
DriverManager
类建立数据库连接。 - 创建
Statement
或PreparedStatement
对象。 - 通过
Statement
或PreparedStatement
对象执行SQL语句。 - 处理查询结果(如果执行的是查询语句)。
- 关闭连接、语句和结果集。
4.PreparedStatement和Statement的区别是什么?
PreparedStatement和Statement的区别主要在于:
- 安全性:
Statement
在拼接SQL语句时,容易受到SQL注入攻击;而PreparedStatement
使用预编译的SQL语句,并通过占位符来传递参数,从而避免了SQL注入的风险。 - 性能:由于
PreparedStatement
是预编译的,因此在多次执行相同的SQL语句时,其性能通常优于Statement
。 - 可读性:使用
PreparedStatement
时,SQL语句和参数是分开传递的,这使得代码更加清晰易读。
5.JDBC中的批处理是什么?
JDBC中的批处理是指将多个SQL语句组合成一个批处理,并一次性提交给数据库执行。这可以减少与数据库的通信次数,提高性能。要使用批处理,可以调用Statement
、PreparedStatement
或CallableStatement
的addBatch()
方法将SQL语句添加到批处理中,然后调用executeBatch()
方法来执行批处理。请注意,不是所有的JDBC驱动程序都支持批处理功能,可以使用DatabaseMetaData.supportsBatchUpdates()
方法来检查目标数据库是否支持批处理更新。