面试宝典-Java反射机制

1. 简介

      Java反射机制是后端开发面试中常常会问到的问题。反射机制是程序在运行时能够获取自身的信息。在Java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。
返回目录

问题1:Java反射的作用是什么?

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

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

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

问题3: 除了使用new创建对象之外,还可以用什么方法创建对象?

      答:使用Java反射可以创建对象

问题4:反射的实现方式都有什么?

      答:获取Class对象,有4种方法:

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

问题5:实现Java反射的类有什么?

      答:

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

问题6:反射机制的优缺点:

      答:
      优点:

  1. 能够运行时动态获取类的实例,提高灵活性;
  2. 与动态编译结合Class.forName(“com.mysql.jdbc.Driver.class”);

      缺点:
      使用反射性能较低,需要解析字节码,将内存中的对象进行解析。
针对缺点其解决方案是:通过setAccessible(true)关闭JDK安全检查来提升反射速度;多次创建一个类的实例时,有缓存会快很多;ReflectASM工具类,通过字节码生成的方式加快反射速度。

问题7:Java反射API有几类?

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

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

问题8:反射使用步骤(获取Class对象、调用对象方法)有哪些?

      答:

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

问题9:Java反射机制的作用是什么?

      答:

  1. 在运行时判断任意一个对象所属的类;
  2. 在运行时构造任意一个类的对象;
  3. 在运行时判断任意一个类所具有的成员变量和方法;
  4. 在运行时调用任意一个对象的方法;

问题10:下面的代码哪些地方会产生编译错误?

public class Outer {
    class Inner {

    }

    public static void foo() {
        new Inner();
    }

    public void bar(){
        new Inner();
    }

    public static void main(String[] args) {
        new Inner();
    }
}

      答:Java中非静态内部类对象的创建要依赖其外部类对象,上面题目中foo和main方法都是静态方法,静态方法中没有this,也就是说没有所谓的外部对象,因此无法创建内部类对象,如果要在静态方法中创建内部类对象,可以这样做:

new Outer().new Inner();

问题11:反射机制的应用场景有哪些?

      答:反射是框架设计的灵魂,在我们平时的项目开发过程中,基本很少会直接使用到反射机制,但这不能说明反射机制没有用,实际上有很多设计、开发都与反射机制有关,例如模块化的开发,通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制,还有我们日常使用的Spring/Hibernate等框架大量使用到了反射机制。
例如:

  • 我们在使用JDBC连接数据库时使用Class.forName()通过反射加载数据库的驱动程序;
  • Spring框架也用到很多反射机制,经典的就是xml的配置模式。Spring通过XML配置模式装载Bean的过程:1)将程序内所有XML或Properties配置文件加载入内存中;2)Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息;3)使用反射机制,根据这个字符串获得某个类的Class实例;4)动态配置实例的属性。

结语:

      在Java编程中,用到反射的地方还是很多的,比如Java框架就大量使用反射,还有在加载驱动和读取配置文件时,反射也是必不可少的。
下一篇:《Java基础-反射》

返回面试宝典目录

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值