今早详情:
阅读公司源码读不下去卡在了,Spring上面,然后Spring的话打算去看自己买的课,再然后那门课我在 timetable 这个小练手的5.0版本还没大致看完,打算看一看然后就看后面讲的Spring。
一、看到里面多次出现反射这一机制,于是去廖雪峰大大的博客看了看,以前以为反射是什么高大上的东西,学习后发现原来也就是这么回事。
简单描述一下就是,获取对应的 Class 实例,然后可以 Instance ,也可以根据获得实例获取其各种信息,甚至访问权限修饰符这种东西也能拿到。
访问字段:
- Java的反射API提供的Field类封装了字段的所有信息:
- 通过Class实例的方法可以获取Field实例:getField(),getFields(),getDeclaredField(),getDeclaredFields();
- 通过Field实例可以获取字段信息:getName(),getType(),getModifiers();
- 通过Field实例可以读取或设置某个对象的字段,如果存在访问限制,要首先调用setAccessible(true)来访问非public字段。
- 通过反射读写字段是一种非常规方法,它会破坏对象的封装。
调用方法:
- Java的反射API提供的Method对象封装了方法的所有信息:
- 通过Class实例的方法可以获取Method实例:getMethod(),getMethods(),getDeclaredMethod(),getDeclaredMethods();
- 通过Method实例可以获取方法信息:getName(),getReturnType(),getParameterTypes(),getModifiers();
- 通过Method实例可以调用某个对象的方法:Object invoke(Object instance, Object... parameters);
- 通过设置setAccessible(true)来访问非public方法;
- 通过反射调用方法时,仍然遵循多态原则。
动态代理:
所谓动态代理其实本质上就是JDK帮我们自动编写了一个实现类(不需要源码,可以直接生成字节码),并不存在可以直接实例化接口的黑魔法。 —— 廖雪峰