吴鹏
字节码对象获得的方式有三种
新建对象后用getClass()方法;用类名.class;还有通过Class.forName(全类名)获得,推荐使用最后一个;
例如:
Class clazz = Class.forName("com.itheima.Student");
通过clazz可以直接调用无参构造,而不必通过Constructor,例如:
Object stu = clazz.newInstance();
------------------------------------------------------------------
通过反射获取构造方法,成员变量跟成员方法中要注意的几个点:
1 在使用getConstructor() 获得构造时,若括号里面没放入任何参数,则获得的是无参构造,在创建对象时,newInstcnce()里面也不能放入任何内容,
对象创建好后里面的数值是默认数值;如果获得的是有参构造,则括号里面必须填入类里面传参的字节码对象,创建对象时也必须传入参数;
2 获取private修饰的成员变量时,设置元素时必须先调用setAccessible(true)方法,开启访问权限;
3 获取方法时,若获取的方法无传参,则getMethod()或getDeclaredMethod()方法里面只需写入方法名,若
获取的方法有传参,则必须写入传参的字节码对象,如getDeclaraedMethod("method",String.class,int.class);
4 调用方法的时候,
若调用的方法无传参,无返回值,则括号里面不需任何内容;
若调用的方法有传参,无返回值,则括号里面必须有相对应的参数;
若调用的方法无传参,有返回值,则需要用一个变量接收返回值;
若调用的方法有传参,有返回值,则括号里面必须有对应的参数,且必须有变量接收返回值;
---------------------------------------------------------------------
JavaBean和BeanUtils相关:
创建一个JavaBean标准的类,要做到:
类使用public修饰;
提供private修饰的成员变量;
为成员变量提供setter和getter方法;
提供public修饰的无参构造;
实现Serializable(实现序列号化);
导入外面的包,可以在项目下面建立一个lib文件夹,把包都丢进去,然后导入,哪个项目要用,哪个项目就要导入;
BeanUtils三个常用的方法,主要记住static void populate(Object bean, Map properties) 这个方法,
如果map用的熟练,可以把static void setProperty(Object bean, String name, Object value)这个拿出来溜溜;
static void populate(Object bean, Map properties)方法里:
map集合里面的键就对应对象里面的变量,键的值就对应变量的值,
所以可以通过把要设置的值先put到map里面,然后通过populate添加,还可以自动帮我们去除在对象里面不存在的变量;
如果要自己重写populate,
用map的keySet()方法获得键后,遍历这个set集合,然后根据每个键(相当于变量名,但是要通过toString转换成字符串),获得
获得对象中的变量,然后用键获得map中对应的值,写进对象中对应变量名,注意打开权限开关(setAccessible(true));
当然,还要判断map这个键在对象中是否存在.
|