• 通过反射获取Class对象的四种方式


    Java反射机制

    反射:通过反射我们可以获取任意一个类的所有属性和方法,还可以调用这些方法和属性。

    反射的优缺点

    优点 :可以让代码更加灵活、为各种框架提供开箱即用的功能提供了便利
    缺点 :让我们在运行时有了分析操作类的能力,这同样也增加了安全问题。
                比如可以无视泛型参数的安全检查(泛型参数的安全检查发生在编译时)。
                另外,反射的性能也要稍差点,不过,对于框架来说实际是影响不大的。

    如果我们动态获取到这些信息,我们需要依靠 Class 对象。Class 类对象将一个类的方法、变量等信息告诉运行的程序。

    四种获取 Class 对象的方式

    • 通过 Class.forName()传入类的全路径获取

    • 通过对象实例instance.getClass()获取

    • 通过类加载器ClassLoader.loadClass()根据类的全路径获取

    • 通过具体的实例对象获取

    举个栗子

    1. /**
    2. * 通过反射获取Class对象的4中方式
    3. */
    4. @Test
    5. public void reflectGetMethod_Test() {
    6. try {
    7. String classPath = "com.hl.magic.items.day20.reflection.ReflectiveDemo";
    8. Class forName = Class.forName(classPath);
    9. LOGGER.debug("[1]根据类全路径获取当前类的路径: {}", forName.getName());
    10. String name = ReflectiveDemo.class.getName();
    11. LOGGER.debug("[2]-根据类对象来获取当前类的路径: {}", name);
    12. ReflectiveDemo reflectiveDemo = new ReflectiveDemo();
    13. Classextends ReflectiveDemo> aClass = reflectiveDemo.getClass();
    14. LOGGER.debug("[3]根据对象实例获取当前类的路径: {}", aClass.getName());
    15. Class aClass1 = ClassLoader.getSystemClassLoader().loadClass(classPath);
    16. LOGGER.debug("[4]根据类加载器获取当前类的路径: {}", aClass1.getName());
    17. // 根据类的path获取对应的属性
    18. ReflectiveDemo reflectiveDemo1 = (ReflectiveDemo) forName.newInstance();
    19. String userName = reflectiveDemo1.getUserName();
    20. LOGGER.debug("获取反射对象的属性 : [{}]", userName);
    21. } catch ( ClassNotFoundException | InstantiationException | IllegalAccessException e) {
    22. e.printStackTrace();
    23. }
    24. }

    输出:

    1. [main] DEBUG com.hl.magic.items.day20.reflection.ReflectiveDemo - [1]根据类全路径获取当前类的路径: com.hl.magic.items.day20.reflection.ReflectiveDemo
    2. [main] DEBUG com.hl.magic.items.day20.reflection.ReflectiveDemo - [2]-根据类对象来获取当前类的路径: com.hl.magic.items.day20.reflection.ReflectiveDemo
    3. [main] DEBUG com.hl.magic.items.day20.reflection.ReflectiveDemo - [3]根据对象实例获取当前类的路径: com.hl.magic.items.day20.reflection.ReflectiveDemo
    4. [main] DEBUG com.hl.magic.items.day20.reflection.ReflectiveDemo - [4]根据类加载器获取当前类的路径: com.hl.magic.items.day20.reflection.ReflectiveDemo
    5. [main] DEBUG com.hl.magic.items.day20.reflection.ReflectiveDemo - 获取反射对象的属性 : [小明]

    通过类加载器获取 Class 对象不会进行初始化,意味着不进行包括初始化等一系列步骤,静态代码块和静态对象不会得到执行。

  • 相关阅读:
    php警车管理系统设计与实现
    竞赛 深度学习 机器视觉 车位识别车道线检测 - python opencv
    elasticSearch配置
    [paddle]paddlepaddle官方安装命令合集
    OpenGL - Gamma Correction
    vue+echarts画甘特图
    C++——入门基础(下)
    论文解读(SAGPool)《Self-Attention Graph Pooling》
    .NET有哪些好用的定时任务调度框架
    【正点原子STM32连载】第四章 STM32初体验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
  • 原文地址:https://blog.csdn.net/qq_27706119/article/details/126119014