关于反射机制及其应用的一些梳理

反射机制是一个很重的开销,很多框架的搭建依赖反射机制,比如Spring的AOP,但是实际开发编码中一般不要用反射,开销太大,也是因为开发过程中接触不多,之前对于反射机制一直是概念模糊的,现在我把反射机制理解成了一句话:根据一个String操作特定的对象(可以是属性,方法甚至是创建这个对象)。

举个例子,还是AOP,典型的就是Spring的注解,其实注解的本质就是在该位置执行一个方法。比如想打印一个日志,写了一个LogUtil有一个printLog()方法,想象一下如果不用注解,要在每个需要打印日志的地方printLog(),静态的方法还好,如果这个方法是非静态的,每个位置都会创建一个LogUtil对象,这就有点浪费内存了。如果用注解,AOP思想可以完美解决这个问题,可以自定义一个注解@Log(msg="_"),假如本质上也就是执行printLog()方法,但是Spring的Bean容器会默认使用单例模式只创建一个对象,至于每个位置想打印的内容不同,利用反射机制动态的去传参调用对象方法,这就做到了哪怕printLog()是非静态的,全局也只有一个对象。

如果要再理解深一点,Spring是如何动态的创建对象以及调用其方法和属性的呢?这就设计反射机制提供的一系列方法。JAVA自带的反射机制本质上是操作接口,与cglib操作字节码不同,JAVA自带的反射机制会外暴一些接口供实现,我们可以实现并利用这些方法去动态的操作这些实现了接口的类,方法有很多,列几个重要的:

1.getClass(),forName()获得class对象

2.getSimpleName()获得类名,getName()获得类名(带路径)

3.getDeclaredFields()获得对象的所有属性

4.newInstance()创建对象

最后还想提一下invoke()方法,用来调用对象方法的。比如创建了一个对象obj,有一个方法action(),先Method method = class.getDeclaredMethod("action")拿到该方法的method对象,再用method.invoke()调用这个方法,可以传参,这是个反射机制很常用的方法。

发布了76 篇原创文章 · 获赞 57 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/weixin_42447959/article/details/90247089
今日推荐