JAVA小白不得不知道的50个面试题(含答案)——第四篇

JAVA小白不得不知道的50个面试题(含答案)——第四篇



前言

问题涵盖了Java基础知识、面向对象编程、集合、多线程、异常处理、泛型、反射、JDBC、JVM以及设计模式等方面。


七、Java反射

1.什么是Java反射?它有哪些用途?

Java反射是Java编程语言的一个特性,它允许程序在运行时(runtime)检查类、接口、字段和方法的信息,并且可以动态地调用它们。反射API主要包含在java.lang.reflect包中。

2. 反射的用途

  1. 动态加载类:当你不确定某个类的全限定名时,可以使用反射来动态加载它。
  2. 调用动态方法:可以调用某个对象上未知的方法,只需要知道方法名和参数类型。
  3. 访问私有成员:尽管通常不推荐这样做,但反射可以访问类的私有成员。
  4. 框架和库:许多框架和库(如Spring、Hibernate等)使用反射来提供灵活性和动态行为。
  5. 测试:在单元测试中,反射可以用来模拟私有方法或访问内部状态。

2. 获取一个类的Class对象

有几种方法可以获取一个类的Class对象:

  1. 使用.class语法

    Class<?> clazz = String.class;
    
  2. 使用对象的getClass()方法

    String str = "hello";
    Class<?> clazz = str.getClass();
    
  3. 使用Class.forName()(通常用于动态加载类):

    try {
        Class<?> clazz = Class.forName("java.lang.String");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    

4. 通过反射调用类的方法

以下是通过反射调用类方法的步骤:

  1. 获取Class对象。
  2. 使用getMethod()getDeclaredMethod()获取Method对象(对于公有方法和私有方法)。
  3. 使用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. 反射的优缺点

优点:

  1. 灵活性:可以在运行时动态地调用方法、访问属性等。
  2. 可扩展性:为框架和库提供了强大的功能,如依赖注入、ORM等。

缺点:

  1. 性能:反射操作通常比直接调用方法或访问字段要慢。
  2. 安全性:允许访问私有成员可能破坏封装性,并可能导致意外的副作用。
  3. 代码清晰度:使用反射的代码通常比直接调用更难理解和维护。
  4. 依赖性问题:反射依赖于字符串(方法名、类名等),这可能导致运行时错误(如拼写错误)。

因此,在决定使用反射之前,应该仔细权衡其优缺点,并确保代码的安全性、可读性和性能。

八、JDBC

1.JDBC是什么

JDBC(Java Database Connectivity)称为Java数据库连接,是一种用于执行SQL语句的Java API,由一组用Java语言编写的类和接口组成。JDBC为多种关系数据库提供统一访问,可以消除因各种数据库操作语言的差异而导致的复杂编程工作。

2.JDBC的工作原理

JDBC的工作原理主要包括以下步骤:

  1. 加载数据库驱动程序:首先,需要加载与数据库相对应的JDBC驱动程序。这通常通过将驱动程序的JAR文件添加到项目的类路径中,并在代码中使用Class.forName()方法来加载驱动程序完成。
  2. 建立数据库连接:使用DriverManager类来连接数据库。通过调用DriverManager.getConnection()方法,并传入数据库URL、用户名和密码作为参数,可以获取一个数据库连接对象。
  3. 执行SQL语句:连接成功后,可以通过Connection对象创建StatementPreparedStatement对象来执行SQL语句。Statement用于执行静态SQL语句,而PreparedStatement则支持动态SQL语句,并可以防止SQL注入攻击。

3.如何使用JDBC连接数据库?

使用JDBC连接数据库通常包括以下步骤:

  1. 加载数据库驱动程序。
  2. 使用DriverManager类建立数据库连接。
  3. 创建StatementPreparedStatement对象。
  4. 通过StatementPreparedStatement对象执行SQL语句。
  5. 处理查询结果(如果执行的是查询语句)。
  6. 关闭连接、语句和结果集。

4.PreparedStatement和Statement的区别是什么?

PreparedStatement和Statement的区别主要在于:

  1. 安全性Statement在拼接SQL语句时,容易受到SQL注入攻击;而PreparedStatement使用预编译的SQL语句,并通过占位符来传递参数,从而避免了SQL注入的风险。
  2. 性能:由于PreparedStatement是预编译的,因此在多次执行相同的SQL语句时,其性能通常优于Statement
  3. 可读性:使用PreparedStatement时,SQL语句和参数是分开传递的,这使得代码更加清晰易读。

5.JDBC中的批处理是什么?

JDBC中的批处理是指将多个SQL语句组合成一个批处理,并一次性提交给数据库执行。这可以减少与数据库的通信次数,提高性能。要使用批处理,可以调用StatementPreparedStatementCallableStatementaddBatch()方法将SQL语句添加到批处理中,然后调用executeBatch()方法来执行批处理。请注意,不是所有的JDBC驱动程序都支持批处理功能,可以使用DatabaseMetaData.supportsBatchUpdates()方法来检查目标数据库是否支持批处理更新。

  • 44
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值