今日内容
 反射
 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 30天java基础知识学习 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方法
 
 
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/20360.html