Java反射常见面试题最新总结

简介: Java反射常见面试题总结

1、什么是Java反射机制?

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。 这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。

1、除了使用new创建对象之外,还可以用什么方法创建对象?

使用Java反射可以创建对象!

2、Java反射创建对象效率高还是通过new创建对象的效率高?

通过new创建对象的效率比较。通过反射时,先找查找类资源,使用类加载器创建,过程比较繁琐,所以效率较低

3、java反射的作用?

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

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

  • 在运行时判定任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判定任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的成员变量和 方法
  • 在运行调用任意一个对象的方法
  • 生成动态代码

4、哪些地方会用到反射?

  1. JDBC中,利用反射动态加载数据库驱动程序
  2. Web服务器中利用反射调用Servlet的服务方法
  3. 框架用到反射机制,注入属性,调用方法,如Spring

5、反射的实现方法?

  1. Class.forName(“类的路径”)
  2. 类名.class
  3. 对象名.getClass()
  4. 基本类型的包装类,可以调用包装类的Type属性来获得该包装类的Class对象

6、实现Java反射的类

  • Class:表示正在运行的Java应用程序中的类和接口
    注意: 所有获取对象的信息都需要Class类来实现。
  • Field:提供有关类和接口的属性信息,以及对它的动态访问权限。
  • Constructor:提供关于类的单个构造方法的信息以及它的访问权限
  • Method:提供类或接口中某个方法的信息

7、反射机制有哪些优缺点?

优点

  • 能够运行时动态获取类的实例,提高灵活性;
  • 与动态编译结合

缺点

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

解决方案:

  1. 通过setAccessible(true)关闭JDK的安全检查来提升反射速度;
  2. 多次创建一个类的实例时,有缓存会快很多
  3. ReflflectASM工具类,通过字节码生成的方式加快反射速度
  4. 相对不安全,破坏了封装性(因为通过反射可以获得私有方法和属性)

8、Java反射API

反射 API 用来生成 JVM 中的类、接口或则对象的信息

  1. Class 类:反射的核心类,可以获取类的属性,方法等信息。
  2. Field 类:Java.lang.reflec 包中的类,表示类的成员变量,可以用来获取和设置类之中的属性
    值。
  3. Method 类: Java.lang.reflec 包中的类,表示类的方法,它可以用来获取类中的方法信息或
    者执行方法。
  4. Constructor 类: Java.lang.reflec 包中的类,表示类的构造方法。

9、反射使用步骤(获取 Class 对象、调用对象方法)

  1. 获取想要操作的类的 Class 对象,他是反射的核心,通过 Class 对象我们可以任意调用类的方法。
  2. 调用 Class 类中的方法,既就是反射的使用阶段。
  3. 使用反射 API 来操作这些信息。

10、获取 Class 对象有几种方法

  1. 调用某个对象的 getClass()方法

    Person p=new Person();
    Class clazz=p.getClass();
    
  2. 调用某个类的 class 属性来获取该类对应的 Class 对象

    Class clazz=Person.class;
    
  3. 使用 Class 类中的 forName()静态方法(最安全/性能最好)

    Class clazz=Class.forName("类的全路径"); //最常用
    

    当我们获得了想要操作的类的 Class 对象后,可以通过 Class 类中的方法获取并查看该类中的方法和属性。

    //获取 Person 类的 Class 对象
    Class clazz=Class.forName("reflection.Person");
    //获取 Person 类的所有方法信息
    Method[] method=clazz.getDeclaredMethods();
    for(Method m:method){
          
        System.out.println(m.toString());
    }
    //获取 Person 类的所有成员属性信息
    Field[] field=clazz.getDeclaredFields();
    for(Field f:field){
          
        System.out.println(f.toString());
    }
    //获取 Person 类的所有构造方法信息
    Constructor[] constructor=clazz.getDeclaredConstructors();
    for(Constructor c:constructor){
          
        System.out.println(c.toString());
    }
    

11、利用反射动态创建对象实例

  1. Class 对象的 newInstance()

    使用 Class 对象的 newInstance()方法来创建该 Class 对象对应类的实例,但是这种方法要求该 Class 对象对应的类有默认的空构造器。

  2. 调用 Constructor 对象的 newInstance()

    先使用 Class 对象获取指定的 Constructor 对象,再调用 Constructor 对象的 newInstance()方法来创建 Class 对象对应类的实例,通过这种方法可以选定构造方法创建实例。

    //获取 Person 类的 Class 对象
    Class clazz=Class.forName("reflection.Person");
    //使用.newInstane 方法创建对象
    Person p=(Person) clazz.newInstance();
    //获取构造方法并创建对象
    Constructor c=clazz.getDeclaredConstructor(String.class,String.class,int.class);
    //创建对象并设置属性13/04/2018
    Person p1=(Person) c.newInstance("李四","男",20);
    
相关文章
|
5天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
18 2
|
10天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
15天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
12天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
37 4
|
12天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
53 4
|
1月前
|
存储 安全 算法
Java面试题之Java集合面试题 50道(带答案)
这篇文章提供了50道Java集合框架的面试题及其答案,涵盖了集合的基础知识、底层数据结构、不同集合类的特点和用法,以及一些高级主题如并发集合的使用。
83 1
Java面试题之Java集合面试题 50道(带答案)
|
25天前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
52 5
|
24天前
|
存储 Java
[Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?
本文介绍了Java中`try...catch...finally`语句的使用细节及返回值问题,并探讨了JDK1.7引入的`try...with...resources`新特性,强调了异常处理机制及资源自动关闭的优势。
19 1
|
25天前
|
存储 Java
[Java]反射
本文详细介绍了Java反射机制的基本概念、使用方法及其注意事项。首先解释了反射的定义和类加载过程,接着通过具体示例展示了如何使用反射获取和操作类的构造方法、方法和变量。文章还讨论了反射在类加载、内部类、父类成员访问等方面的特殊行为,并提供了通过反射跳过泛型检查的示例。最后,简要介绍了字面量和符号引用的概念。全文旨在帮助读者深入理解反射机制及其应用场景。
16 0
[Java]反射
|
1月前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
28 3