反射:通过反射我们可以获取任意一个类的所有属性和方法,还可以调用这些方法和属性。
优点:可以让代码更加灵活、为各种框架提供开箱即用的功能提供了便利
缺点:让我们在运行时有了分析操作类的能力,这同样也增加了安全问题。
比如可以无视泛型参数的安全检查(泛型参数的安全检查发生在编译时)。
另外,反射的性能也要稍差点,不过,对于框架来说实际是影响不大的。
如果我们动态获取到这些信息,我们需要依靠 Class 对象。Class 类对象将一个类的方法、变量等信息告诉运行的程序。
-
通过
Class.forName()
传入类的全路径获取 -
通过对象实例instance.getClass()获取
-
通过类加载器ClassLoader.loadClass()根据类的全路径获取
-
通过具体的实例对象获取
/** * 通过反射获取Class对象的4中方式 */ @Test public void reflectGetMethod_Test() { try { String classPath = "com.hl.magic.items.day20.reflection.ReflectiveDemo"; Class<?> forName = Class.forName(classPath); LOGGER.debug("[1]根据类全路径获取当前类的路径: {}", forName.getName()); String name = ReflectiveDemo.class.getName(); LOGGER.debug("[2]-根据类对象来获取当前类的路径: {}", name); ReflectiveDemo reflectiveDemo = new ReflectiveDemo(); Class<? extends ReflectiveDemo> aClass = reflectiveDemo.getClass(); LOGGER.debug("[3]根据对象实例获取当前类的路径: {}", aClass.getName()); Class<?> aClass1 = ClassLoader.getSystemClassLoader().loadClass(classPath); LOGGER.debug("[4]根据类加载器获取当前类的路径: {}", aClass1.getName()); // 根据类的path获取对应的属性 ReflectiveDemo reflectiveDemo1 = (ReflectiveDemo) forName.newInstance(); String userName = reflectiveDemo1.getUserName(); LOGGER.debug("获取反射对象的属性 : [{}]", userName); } catch ( ClassNotFoundException | InstantiationException | IllegalAccessException e) { e.printStackTrace(); } }
输出:
[main] DEBUG com.hl.magic.items.day20.reflection.ReflectiveDemo - [1]根据类全路径获取当前类的路径: com.hl.magic.items.day20.reflection.ReflectiveDemo [main] DEBUG com.hl.magic.items.day20.reflection.ReflectiveDemo - [2]-根据类对象来获取当前类的路径: com.hl.magic.items.day20.reflection.ReflectiveDemo [main] DEBUG com.hl.magic.items.day20.reflection.ReflectiveDemo - [3]根据对象实例获取当前类的路径: com.hl.magic.items.day20.reflection.ReflectiveDemo [main] DEBUG com.hl.magic.items.day20.reflection.ReflectiveDemo - [4]根据类加载器获取当前类的路径: com.hl.magic.items.day20.reflection.ReflectiveDemo [main] DEBUG com.hl.magic.items.day20.reflection.ReflectiveDemo - 获取反射对象的属性 : [小明]
通过类加载器获取 Class 对象不会进行初始化,意味着不进行包括初始化等一系列步骤,静态代码块和静态对象不会得到执行。
热门文章
- 「1月25日」2025年最新高速Clash/V2ray/Shadowrocket/SSR免费节点订阅链接地址分享
- 「2月19日」2025年最新高速Shadowrocket/Clash/SSR/V2ray免费节点订阅链接地址分享
- 看完这篇文章你就可以告诉领导你精通Zookeeper了
- 动物疫苗规定有哪些(动物疫苗新法案)
- 「1月29日」2025年最新高速Clash/Shadowrocket/SSR/V2ray免费节点订阅链接地址分享
- 「1月17日」2025年最新高速Shadowrocket/Clash/SSR/V2ray免费节点订阅链接地址分享
- 宠物粮食生产厂家电话地址 宠物粮食生产厂家电话地址查询
- 重庆正规免费领养宠物猫的地方(重庆哪里有免费领养猫)
- 重庆的宠物批发市场在哪里(重庆的宠物批发市场在哪里啊)
- GO语言学习——基本数据类型字符串