2019.07.26(day21)
常规的反射api:
-反射方式创建对象
1.用无参的构造创建对象
Class对象.newInstance();//常用
@Test
public void test1() throws Exception{
Class clazz=Class.forName("反射.User");
Object obj=clazz.newInstance();
System.out.println(obj.getClass());
}
2.用有参构造创建对象
Class对象.getConstructor(new Class[]{若干参数的类类型}).newInstance(构造函数的参数);
@Test
public void test2() throws Exception{
Class clazz=Class.forName("反射.User");
Constructor constructor=clazz.getConstructor(String.class,String.class);
Object obj=constructor.newInstance("张三","s001");
System.out.println(obj.getClass());
}
-反射的方式获取Field中的信息
1.获取当前类以及长辈类的public Field
Field[] fields=Class对象.getFields();
2.获取当前类中的所有的属性Field
Field[] fields=Class对象.getDeclaredFields() ;
3.获取当前类以及长辈类中指定的公有属性
Field field=Class对象.getField(String fieldName);
4.获取当前类中指定的属性
Field field=Class对象.getDeclaredField(String fieldName);
5.通过反射设定Field属性的值
Field对象.set(Object obj,Object value);
如果Field对象是私有的
必须先执行:Field对象.setAccessable(true);//设置属性可以访问
6.通过反射获取Field的值
Object value=Field对象.get(Object obj);
如果Field是私有
必须先执行:Field对象.setAccessable(true);//设置属性可以访问
-反射的方式获取Method方法的信息
1.获取当前类以及长辈类的公有方法
Method[] methods=Class对象.getMethods();
2.获取当前类中的所有的方法
Method[] methods=Class对象.getDeclaredMethods();
3.获取当前类以及长辈类中的指定的公用的方法
Method method=Class对象.getMethod(String methodName,new Class[]{methodName的参数类型});
4.获取当前类中的指定的方法
Method method=Class对象.getDeclaredMethod(String methodName,new Class[]{methodNamed的参数类型});
5.通过反射动态调用指定Method
Object returnValue=Method对象.invoke(Object obj ,Object...args);
解析:
就是通过obj这个对象调用Method对象确定的方法,给这个方法
传递args参数,Method对象对应的方法的返回值是returnValue
-反射获取Constructor构造函数
查api文档
-反射获取Annotatioin注解
查api文档
反射的应用场景:
-用反射实现jdbc的通信查询和通用更新
-用反射解析注解
-单元测试,就是用反射实现的
-常见的框架,spring框架,springmvc框架...都是用反射实现的
-EL表达式
...
反射的优点:
大幅度提高开发效率,框架就是用反射实现的,框架提高了开发效率
反射的缺点:
反射的执行效率比非反射的执行效率低
反射会暴露类中的所有细节,突破了封装