反射机制是Java语言中很重要的特性,是在运行时获知对象信息,并可在运行时操作对象的机制。
反射(Reflect), 顾名思义,通过Java对象的Class信息,可以逆向生成对象、探知运行时的对象信息、调用对象方法,一种可以反向作用的机制。
反射的用途:
1. 在运行时获取任意对象所属的类对象
Class<?> clazz = Class.forName(String className);
2. 在运行时构造任意类的对象
Object obj = clazz.newInstance();
3. 在运行时获取任意类所具有的成员变量和方法
field.set(Object obj, Object value);
field.get(Object obj);
4. 在运行时调用任意对象的方法 (最常见的需求,尤其是当该方法是私有方法或者隐藏方法)
method.invoke(Object obj, Object... args);
通过反射机制,已知的应用有:
1. ORM框架使用了反射机制,来实现对象和数据表的映射关系;
2. 动态代理中使用反射机制,动态生成代理角色,这样比较好地解决了静态代理的代码膨胀问题。
常用的获取类信息方法:
1. 获取类对象
Class clazz = obj.getClass();
或 Class clazz = Class.forName(${className});
2. 获取对象中声明的方法:
Method[] methods = clazz.getDeclaredMethods();
3. 获取对象的属性数据:
Field[] fields = clazz.getDeclaredFields();
动态执行对象的方法:
1. Method.invoke() 动态执行对象的方法
如果是私有方法,先把Method的可见性设为true,然后再调用。
method.setAccessible(true);
2. Field.setXXX() 动态设置对象的属性
总结:
反射机制使Java语言在很大程序上增强了灵活性,在语言的动态的功能扩展上有了更多的想象力和空间。