• 高级java每日一道面试题-2024年7月14日


    面试官: 你对java反射了解多少?

    我回答

    什么是java反射:

    Java反射机制是一种强大的运行时自省机制,允许程序在运行时检查和操作类、接口、构造器、方法和字段等类型信息。通过反射,Java程序可以在运行时动态地加载类、创建对象、调用方法、获取和设置字段值,甚至修改访问权限。这种能力使Java程序具有高度的灵活性和扩展性。

    反射的主要用途:

    1. 动态创建实例:通过Class对象的newInstance()方法创建一个对象实例。
    2. 访问和修改私有成员:可以获取并访问一个类的私有字段、私有方法等。
    3. 调用方法:通过Method对象的invoke()方法调用一个对象的方法。
    4. 获取类信息:包括类名、父类、接口、字段、方法等。

    反射的核心类

    1. Class类:反射的核心类,代表正在运行的Java应用程序中的类和接口。通过Class对象,可以获取类的信息,如成员变量、方法、构造器等。
    2. Field类:提供有关类和接口的属性信息,以及对它的动态访问权限。
    3. Method类:提供类或接口中某个方法的信息,并可以执行该方法。
    4. Constructor类:提供关于类的单个构造方法的信息以及它的访问权限,并可以创建类的实例。

    反射的基本操作:

    获取Class对象
    • 使用类名直接获取,如String.class
    • 使用对象的getClass()方法,如new String().getClass()
    • 使用Class.forName()方法,传入类的全限定名,如Class.forName("java.lang.String")
    获取构造器(Constructors)
    • 使用Class对象的getDeclaredConstructors()getConstructors()方法。前者返回所有声明的构造器,包括私有的;后者只返回public的构造器。
    获取方法(Methods)
    • 使用Class对象的getDeclaredMethods()getMethods()方法。同样,前者返回所有声明的方法,后者只返回public的方法。
    获取字段(Fields)
    • 使用Class对象的getDeclaredFields()getFields()方法。前者返回所有声明的字段,后者只返回public的字段。

    反射的优缺点

    优点
    1. 提高灵活性:可以在运行时动态地创建对象、调用方法、访问属性等,提高了程序的灵活性。
    2. 与动态编译结合:可以与动态编译技术结合,实现更强大的功能。
    缺点
    1. 性能较低:反射需要解析字节码,将内存中的对象进行解析,因此性能较低。
    2. 破坏封装性:通过反射可以访问类的私有成员,破坏了类的封装性。
    3. 安全性问题:如果过度使用反射,可能会带来安全问题,如允许非法访问类的内部信息等。

    反射的注意事项:

    • 性能:反射操作比直接的Java代码要慢,因为它涉及额外的运行时查询。
    • 安全性:使用反射可以破坏封装性和安全性,比如访问私有成员。
    • 异常处理:反射操作经常抛出ClassNotFoundExceptionNoSuchMethodExceptionIllegalAccessExceptionInvocationTargetException等异常,需要妥善处理。

    反射的应用场景:

    • 框架开发:Spring框架大量使用反射来实现依赖注入。
    • 动态代理:JDK动态代理、CGLIB等基于反射实现。
    • 测试:单元测试中,反射可以用来访问和修改私有状态。
    • 代码解析:IDE和代码分析工具会使用反射来获取类的信息。
  • 相关阅读:
    九、ELK安装ElastAlert 2插件钉钉机器人告警
    CDGA|数据素养对数据治理工作真的很重要!
    【Spring面试】一、SpringBoot启动优化与Spring IoC
    学习VGG笔记
    字符串首尾空格去除问题
    springBoot复杂对象表示和lombok的使用
    stm32 hal库 st7789 1.54寸lcd
    2022年SQL经典面试题总结(带解析)
    如何做好工作汇报?这些要点要注意
    建站选择免费虚拟主机的六大误区
  • 原文地址:https://blog.csdn.net/qq_43071699/article/details/140411466