反射机制
Published by Shangyu Liu,
反射机制是spring等框架实现依赖注入(控制反转)的基础,spring鼓励将类的实例化的控制权交给框架,而框架实例化类的手段就是通过反射机制完成的。
反射,是在实例与类之间的反射,可以供过类得到实例化的引用,反之,可以通过实例,得到类的全部信息。
从class到instance往往通过new进行,从实例获取到类则有三种方法:
1、oneInstance.getClass()
2、oneClass.class
3、Class.forName("包名.类名")
这三种方法获得到的是一个对象,这个对象属于Class类,不错就是有这样一个Class类,与其他类一样也是Object的子类,java完成编译后,每个类会对应一个Class的实例,这个实例描述了这个类的信息。第三种方法中的forName就是Class的静态方法。与此同时完成反射机制的还有另外三个java内置的类:
Class、Constructor、Field、Method
Class类提供的方法包括:
public final Class>getClass()
public static Class>forName(String className) throws ClassNotFoundException
Constructor[] getConstructors()
Method[] getMethods() ,返回public的
Method[] getDeclaredMethods() ,返回所有的
Field[] getFields(),返回public的
Field[] getDeclaredFields(),返回所有的
Object get(Object obj),得到引用类型属性值
void set(Object obj, Object val),将obj对象的该属性设置成val值,针对引用类型赋值。
Object invoke(Object obj, Object args)。
不同语言的反射机制
js的反射机制是怎样的呢,事实上js不需要反射机制,反射最大的用途是new一个不确定的类,new的类是个变量,java不能new一个变量,必须new接上一个确定的类名,我们无法把一个class本身作为变量赋值给另一个命名变量,然后拿着这个有名字的变量去new出一个实例,因此才有了java的反射机制。但这些到了js中完全不是问题,js中类是函数,函数可以作为变量赋值给命名变量,拿着这个命名变量可以去执行这个函数,也可以把它当作构造函数实进行例化,因而js的依赖注入不需要js特殊提供额外的反射机制。