首先,明白静态语言与动态语言的区别
Java是一门静态语言,但是反射提供了一种黑魔法,允许在运行时去动态修改一个类的定义,一个对象的属性等等,给静态语言加上了“动态”的效果
Java反射可以简单的理解为Class的一种抽象,我们知道,Java是面向对象语言,一切皆对象,都是某种抽象,可以理解反射就是对Class的抽象,所以,通过反射,你可以获取类名,注解,属性,构造器,gettter/setter等等,动态调用方法,修改属性,修改属性的访问权限等等
Java反射的应用很多,如,JSON的序列化/反序列化,JDK动态代理,AOP等等
这样会让java在编写的时候不容易出错,但也会对一些东西形成阻碍,尤其是一些相互之间没有关系的那种,例如,我想通过一个静态方法,把类型A的对象a,他的一些字段复制给类型B的对象b的同名同类型字段上面,而A和B没有关系,他们可以是任何类。
你看,这样的话我们无法直接通过A和B的get和set方法来读写这些字段吧?因为A和B没有任何关系,他们在这个方法的参数中,只能是Object类型,而对一个未知类型的对象进行操作,反射就是必不可少的了。
对未知类型的对象或仅仅知道该对象实现的接口,抽象类的而不知道具体类型的时候 我们可以使用反射完成对他的操作。
上面这个例子就是BeanUtils里面的一个方法:copyProperties,它能够将一个对象的内容复制到另一个对象里面。
那么像这种通用的方法,不局限于某一个类或者某一个对象,很大几率都是通过反射做到的。
除此之外,反射还有更加广泛的用途。
在java中,能够控制应用的一部分,或者整体的启动和关闭,需要你编程来配合它的工作,那么这种类库应该被称作框架,一个很著名的框架是spring,spring可以自己根据你的配置自动的创建各种类的对象,能够自动调用他们的set方法,甚至不通过set方法来设置字段的值,而这都是通过反射做到的,因此你可以在spring中使用任何类和对象,只要配置正确,它都能被spring纳入管理范围。
WRITE-BUG研发团队衷心希望【WRITE-BUG数字空间】可以给每位同学一个属于自己的秘密空间,同时祝愿大家在“公开圈子”世界里,遇见志同道合的伙伴们,因为我们与大家一样,都曾孤独前行着。
标签:反射,set,Java,对象,spring,类型,java,用处 From: https://blog.51cto.com/u_16125770/7230036