1.是java提供的动态执行机制,动态加载类,动态创建对象,动态访问属性,动态调用方法
静态与动态
静态:事先约定的规则,执行期间按照固定执行规则
动态:事先没有约定,在执行期间动态确定执行规则
java中的静态执行;编译已经就确定执行规则,在运行期间按照编译结果顺序执行
java中的动态执行:运行期间才能确定加载那些类,创建那些对象,执行那些方法
2.java提供了动态加载类的api
class cls = Class.forName(类名);
3.动态创建对象
object obj= cls.newInstance();
执行cls引用的类的信息中的无参构造器,动态创建对象实例,
提示:反射可以调用有参构造器
4.动态获取类的方法信息
cls.getDeclaredMethods() *带s,返回数组
5.动态的执行方法
method.invoke(被调用的对象,传递的参数 )
例如:购买饮料.invoke(小卖铺,钱)
在invoke方法执行的时候,必须传递包含当前方法的对象
6.使用invoke
invoke可以使用私有方法
1.先找到该私有方法(共有也可以)
Class 提供了根据方法签名找到指定的方法信息的API
方法签名 = 方法名+类型列表(Class[])
Method method=class.getDeclaredMethod(方法名,类型列表); *不带s,找到返回方法名,找不到抛异常
打开方法的执行权限
method.setAccessible(true)//该方法违反了封装的一件事情,不建议使用
调用invoke
method.invoke(被调用的对象,传递的参数 )
7.反射用途(不知道类名,方法名,只知道执行的结果要用反射)
*1.eclipse中解析类的结构使用了反射
*2.Junit识别被测试方使用了反射
*3.Spring管理Bean对象,注入Bean属性使用了反射
*4.注解的解析使用了反射
*5.强行执行私有方法(访问私有属性)
8.检查一个注解的信息:
方法名.getAnnotation(注解名.class);