今日内容
反射
BeanUtils类
反射
在运行时期,可以获取和调用类的成员(构造、成员变量和成员方法等),包括私有的。
反射的前提:
获取类的字节码对象(Class对象)
获取字节码对象的方式:
(1)对象.getClass()
比如:
Student s = new Student();
Class clazz = s.getClass();
(2)类名.class
比如:
Class clazz = Student.class;
(3)Class.forName(String className):这种方式在三种方式中最常用
比如:
Class.forName("com.itheima_01.Student");// 方法中传递的类名必须是全类名
Class类
构造方法:
public修饰的
Constructor<T> getConstructor(Class<?>... parameterTypes):获取指定的参数的(public修饰的)构造方法
Constructor<?>[] getConstructors() :获取所有的(public修饰的)构造方法
所有权限修饰符修饰的
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 获取(所有权限修饰符修饰的)指定的构造方法
Constructor<?>[] getDeclaredConstructors() 获取(所有权限修饰符修饰的)所有的构造方法
成员变量:
public修饰的
Field getField(String name) :获取指定的(public修饰的)成员变量(指定的String)的Field类型对象
Field[] getFields() :获取所有的(public修饰的)成员变量的Field类型对象数组
所有权限修饰符修饰的量
Field getDeclaredField(String name) :获取(所有权限修饰符修饰的)指定的成员变量,包括public、protected、默认和private
Field[] getDeclaredFields() :获取(所有权限修饰符修饰的)所有的成员变量
方法
public修饰的
Method getMethod(String name, Class<?>... parameterTypes) :获取指定的(public修饰的)方法的Method类型对象
Method[] getMethods() :获取所有的(public修饰的)方法的Method类型对象数组
所有权限修饰符修饰的
Method getDeclaredMethod(String name, Class<?>... parameterTypes):获取(所有权限修饰符修饰的)指定所有的方法的Method类型对象
Method[] getDeclaredMethods() :获取(所有权限修饰符修饰的)所有的方法的Method类型对象数组
构造方法(Constructor)
Constructor类
T newInstance(Object... initargs) :调用构造方法创建对象,如果不给定参数,调用的是空参构造,如果给定参数调用的是有参构造
使用(创建对象)
无参的构造
方式一:调用Constructor类中的newInstance()
步骤:
(1)获取Class对象
例如:Class clazz = Class.forName("com.itheima_01.Student");
(2)通过Class类中的getConstructor()获取空参构造的Constructor对象
例如:Constructor c =clazz.getConstructor();
(3)通过Constructor类中的newInstance()方法使用空参构造创建对象
例如:Object obj = c.newInstance();
方式二:调用Class类中的newInstance()
步骤:
(1)获取Class对象
例如:Class clazz = Class.forName("com.itheima_01.Student");
(2)通过Class类中的newInstance()方法使用空参构造创建对象
例如:Object obj = clazz.newInstance();
有参的构造
方式:通过调用Constructor类中的newInstance(Object... initargs)
步骤:
(1)获取Class对象
例如:Class clazz = Class.forName("com.itheima_01.Student");
(2)通过Class类中的getConstructor(Class<?>... parameterTypes)获取指定的有参构造的Constructor对象
例如:Constructor c = clazz.getConstructor(String.class,int.class);
(3)通过Constructor类中的newInstance(Object... initargs)方法传递实际参数通过有参构造创建对象
例如:Object obj = c.newInstance("lisi",30);
成员变量(Field)
Field类
void set(Object obj, Object value) :给指定的对象的成员变量赋值,指定一个新的值
Object get(Object obj) :获取指定对象的成员变量的值
void setAccessible(boolean flag):取消访问权限,暴力访问【父类继承的方法】
使用(取值和赋值)
public修饰的成员变量
步骤:
(1)获取Class对象
例如:Class clazz = Class.forName("com.itheima_01.Student");
(2)创建对象
例如:Object stu = clazz.newInstance();
(3)调用Class类中的getField(String name)方法,获取指定的成员变量的Field类型对象
例如:Field f = clazz.getField("age");
(4)调用Field类中的set(Object obj, Object value)方法赋值,或者调用get(Object obj)方法取值
例如:f.set(stu, 28);
例如:Object age = f.get(stu);
非public修饰的成员变量
步骤:
(1)获取Class对象
例如:Class clazz = Class.forName("com.itheima_01.Student");
(2)创建对象
例如:Object stu = clazz.newInstance();
(3)调用Field类中的getDeclaredField(String name)方法,获取指定的成员变量的Field类型对象
例如:Field f = clazz.getDeclaredField("name");
(4)调用Field类中的setAccessible(boolean flag)方法,参数传递true
例如:f.setAccessible(true);
(5)调用Field类中的set(Object obj, Object value)方法赋值,或者调用get(Object obj)方法取值
例如:f.set(stu, "李四");
例如:Object name = f.get(stu);
成员方法(Method)
Method类
Object invoke(Object obj, Object... args) :调用指定对象的指定方法,返回指定方法的返回值,
如果Method对象底层表示的方法没有返回值,那么invoke方法的返回结果为null
使用(调用方法)
步骤:
(1)获取Class对象
例如:Class clazz = Class.forName("com.itheima_01.Student");
(2)创建对象
例如:Object stu = clazz.newInstance();
(3)通过Class类中的getMethod(String name, Class<?>... parameterTypes)方法获取指定方法的Method类对象
例如:Method m = clazz.getMethod("setName", String.class);
(4)调用Method类中的invoke(Object obj, Object... args)方法,传递指定对象和方法的实际参数
例如:m.invoke(stu, "lisi");
课堂案例一:
1、已知一个类,定义如下:
package com.itheima;
public class DemoClass {
public void run() {
System.out.println("welcome to heima!");
}
}
(1)写一个Properties格式的配置文件,配置类的完整名称。
(2)写一个程序,读取这个Properties配置文件,获得类的完整名称并加载这个类,
(3)用反射 的方式运行run方法。
课堂案例二:
2.ArrayList<Integer> list = new ArrayList<Integer>();
这个泛型为Integer的ArrayList中存放一个String类型的对象
BeanUtils类
JavaBean
作用:用来封装数据
规范:
(1)类要用public修饰
(2)成员变量用private修饰
(3)提供public修饰的getters和setters
(4)提供空参构造
(5)实现序列化接口(Serializable),生成序列号
BeanUtils
用来简化我们对JavaBean的操作的,是JavaBean操作的工具类
它是第三方的类库(既不是JDK提供,也不是我们自己编写),使用的时候必须要导入jar包
是Apache软件联盟提供的一个组件
www.apache.org
BeanUtils类
常用方法
/**
* 给指定的成员变量赋值,作用类似于setXxx()方法
*
* Object bean:JavaBean对象,指定哪一个对象
* String name:成员变量的名称
* Object value:为成员变量赋的值
*/
static void setProperty(Object bean, String name, Object value)
/**
* 获取指定的成员变量的值,作用类似于getXxx()方法
*
* Object bean:JavaBean对象,指定哪一个对象
* String name:成员变量的名称
*/
static String getProperty(Object bean, String name)
/**
* 给指定的成员变量赋值,一次可以为对象的多个成员变量同时赋值
*
* Object bean:JavaBean对象,指定哪一个对象
* Map properties:将成员变量的名称及其对应的值封装到Map集合中,一次可以同时为这些多个的成员变量赋值
*/
static void populate(Object bean, Map properties)
注意:BeanUtils的setProperty和getProperty方法底层并不是直接操作成员变量,而是操作和成员变量名有关的get和set方法
今日内容重点
掌握反射获取构造方法并使用
掌握反射获取成员变量并使用
掌握反射获取成员方法并使用
掌握可变参数的使用
掌握反射相关的两个课堂案例
知道JavaBean的5个规范
掌握BeanUtils类三个方法使用
掌握MyBeanUtils类模拟三个方法的代码