今天一天就讲了一个反射,其实反射本身很简单,只是运用起来相对复杂;
先说说反射是干嘛的吧!反射的强大之处就在于他可以通过.class的文件,调用原生Java文件中的任何属性,方法,不管是私有还是公共的。
注意:反射调用的类一定要有一个无参的构造器
现在介绍一下获取反射模板的三种方式:
1)类名.class
eg:Class clazz1=Reflect01.class;
2)先new对象,在用对象.getClass获取
eg:Reflect01 reflecto1=new Reflect01();
Class clazz2=reflecto1.getClass();
3)Class.forName(包名+类名)
eg:Class clazz3=Class.forName("com.cdsxt.test.vo.User");这里会抛异常,是因为路径可能不对,需要trycatch
反射几个常用的API:
getSimpleName:获取类名;
getName:1)Class类中的getName方法:获取包名+类名,即全类名
2)Field类中的getName方法:获取属性的名字
getPackage:获取包名,即从src下的全部包路径
getType:Field类中的getType方法:获取属性的类型
getField:获取所传参数的属性对象
getFields:获取该类中的所有属性对象
getDeclaredField和getDeclaredFields:获取私有的属性对象,只要有Declared都可以获取私有的方法,属于。。。。
newInstance:获取类对象
/*
* 设置属性值的方法
* 1)a) 获取属性对象:clazz.getField("属性名")
* b) 获取类对象:clazz.newInstance();
* c) 通过set方法赋值:获取到的属性对象.set(获取到的类对象, 值);
* d) 通过get方法的到值:获取到的属性对象.get(获取到的类对象)
*/
/*
* 通过反射模板获取方法的方式 和调用方法的方式
* 1)三种方式获取类,类名.class,Class.forName("包名+类名"),先new对象,在用对象.getClass
* 2)clazz.getMethods()返回方法数组,clazz.getMethod(方法名 ,参数列表【类型.calss】 );私有的就加Declared
* 3)getName()获取方法名,getReturnType()获取返回值类型
*/
/*
* 通过方法对象 调用方法1
* 1)a)获取模板上的方法:getDeclaredMethod("方法名字")
* b)invoke方法:method.invoke(obj);无参不传,有参传方法对应的参数,另外,静态传null,非静态传obj
* c)最后达到调用该方法的目的
*
*/
反射的应用:利用反射来封装数据库的增删改查方法,好处在于,可以查询任何类型表
在用反射封装时,还用到了泛型参数,泛型简单点说就是不确定类型,你传什么类型的参数,泛型就代表什么类型。