浅谈java中的反射
-
什么是反射
- 概念: 主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(通俗的讲反射就像一个人在照镜子通过镜子来反映出你的外貌特征 体型等特点)
-
为什么使用反射
- 如果在一个程序中实例化一个类我们通常是使用
new
关键字来进行对象的创建,如果我们需要改变实例化对象就必须改变源代码,我们知道如果改变一个正确的源代码是非常可怕的,会带来意想不到的错误。这时候就用到了反射这个特性,如在java中 我们可以通过Class.forName("类名").newInstance()
来进行类的实例化,这样在不改变源代码的情况下完全可以动态的修改类的属性方法等。
- 如果在一个程序中实例化一个类我们通常是使用
-
使用反射有什么好处
- 使得编码更加灵活(例如spring 的xml 文件就是使用反射来进行类的实例化,如果不使用反射那这些类就的硬编码在代码里了)
- 类与类之间耦合度更低
-
到底怎么使用反射
- 在java中有四种方式来获取类的属性,方法等:
- 目标类
@Builder(toBuilder = true) @Getter public class User { private String name; private String age; }
- 解释:
@Builder
注解是lombok
的注解,它旨在构建实体对象类时候不提供setter
方法只提供getter
方法, 所有属性私有,在进行类的实例化时候通过使用类的builder方法进行属性的赋值。使得代码更加优雅,不对外公开类的写操作。 - 实现代码
以上只是简单的获取类的名称 反射还有很多方法(如获取类的实现接口,类的注解等)请自行百度javaAPI文档进行学习。@Test public void reflectDemo() throws ClassNotFoundException { //第一种(使用实例化的对象进行反射) User user = User.builder() .name("张三") .age("李四") .build(); Class<? extends User> aClass = user.getClass(); System.out.println("使用实例:"+aClass.getName()); //第二种 Class<?> aClass1 = Class.forName("bean.User"); System.out.println("使用类静态方法:"+aClass1.getName()); //第三种 System.out.println("使用User类的class方法:"+User.class.getName()); //第四种 Class<?> user1 = this.getClass().getClassLoader().loadClass("bean.User"); System.out.println("使用类加载器:"+user1.getName()); }
- 目标类
- 在java中有四种方式来获取类的属性,方法等:
- 注意:由于反射机制模糊了代码的内部逻辑,所以一般普通的程序不太推荐使用反射来进行构建,会使得系统复杂度增加难以维护。一般反射用在系统对灵活性以及可扩展性有较高要求的框架中(如Spring全家桶大量使用了反射机制)