java学习--基础知识进阶第十三天--笔记

今日内容
反射
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类模拟三个方法的代码

原文地址:https://www.cnblogs.com/bigorangehasc/p/8639747.html

时间: 2024-10-29 00:21:05

java学习--基础知识进阶第十三天--笔记的相关文章

java学习--基础知识进阶第十三天--反射机制的概述和字节码对象的获取方式、反射操作构造方法、成员方法、成员属性、JavaBean的概述&amp;BeanUtils的使用、自定义BeanUtils工具类

今日内容介绍 u 反射机制的概述和字节码对象的获取方式 u 反射操作构造方法.成员方法.成员属性 u JavaBean的概述&BeanUtils的使用 u 自定义BeanUtils工具类 第1章 反射机制概述.字节码对象的获取方式.反射操作构造方法.成员方法.成员属性 1.1 反射机制的概述和字节码对象的获取方式 1.1.1 反射介绍 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法        这种动态获取的以及动

java学习--基础知识进阶第三天--笔记

今日内容 接口 多态 接口interface 接口的概述 接口是比抽象类还抽象的类,因为接口所有的方法都是抽象方法 接口的由来 可以解决Java中类单一继承的局限性 格式: interface 接口名 { } 使用 implements ,类去实现接口 接口中成员的特点 成员变量 只有常量 默认的修饰符 public static final 成员方法 只有抽象方法,没有非抽象方法 默认修饰符 public abstract 构造方法 没有构造方法 类与接口之间的关系 类与类:继承关系(exte

java学习--基础知识进阶第四天--笔记

今日内容 包 权限修饰符 内部类 包(package) 包的作用 用来分类管理Java文件 包的特点 (1)可以有多层,每一层之间用.来隔开 (2)相同包下不能有同名的类,不同包下可以有同名的类 (3)包声明使用package关键字,包声明必须位于文件的第一行有效代码 包的命名规范: 全部都小写,如果有多层使用.来隔开 一般都是公司域名倒着写,www.itheima.com->com.itheima 不同包的下的类互相访问 相同包下的类可以互相访问 不同包下的类的访问需要导包,使用import关

java学习--基础知识进阶第十天--笔记

标准的输入输出流 标准的输入流:System.in,默认指向的是键盘 标准的输出流:System.out,默认指向的是控制台 改变输入输出流的默认指向 static void setIn(InputStream in) 重新分配"标准"输入流. static void setOut(PrintStream out) 重新分配"标准"输出流. 转换流 OutputStreamWriter,字符流,是字符流通向字节流的桥梁 InputStreamReader,字符流,是

java学习--基础知识进阶第二天--继承、匿名对象&amp;final、抽象类

今日内容介绍 u 继承 u 抽象类 第1章 继承 1.1 继承的概述 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系. 1.2 继承的格式&使用  在程序中,如果想声明一个类继承另一个类,需要使用extends关键字. 格式: class 子类 extends 父类 {} 1.2.1 案例代码一: package com.itheima_01; /* * 继承:多个类有共同的成员变量和成员方法,抽取到另外一个类

java学习--基础知识进阶第三天--接口、多态

今日内容介绍 u 接口 u 多态 第1章 接口 1.1 接口的概述 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的"类". 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的定义与实现分离,优化了程序设计. 1.2 接口的格式&使用 1.2.1 接口的格式 与定义类的class不同,接口定义时需要使用interface关键字. 定义接口所在的仍为.java文件,虽然声明时使用的为interface关键字

java学习--基础知识进阶第一天--static静态关键字、代码块

今日内容介绍 u 知识回顾 u static静态关键字 u 代码块 第1章 知识回顾 1.1 方法的回顾 1.1.1 案例代码一: package com.itheima_01; /* * 需求:定义一个方法求两个数的和,并在主方法中调用 * * 方法:类中的一段具有特定功能的程序,提高了代码的复用性和可维护性 * 定义格式: * public static 返回值类型(没有返回值写void) 方法名(参数类型 参数名,参数类型 参数名2) {//形参 * 方法体; * } * 调用方式: *

java学习--基础知识进阶第十二天--网络编程概述、UDP协议、TCP协议

今日内容介绍 u  网络编程概述 u  UDP u  TCP 第1章 网络编程概述 1.1 网络协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式.传输速率.传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换. 网络通信协议有很多种,目前应用最广泛的是TCP/IP协议(Transmission Contro

java学习--基础知识进阶第十天--标准输入流 &amp; 转换流 &amp; 打印流、对象操作流 、Properties集合

今日内容介绍 u  标准输入流 & 转换流 & 打印流 u  对象操作流 u  Properties集合 第1章 标准输入流 & 转换流 & 打印流 1.1 标准输入输出流 public static final InputStream in:标准输入流 public static final PrintStream out:标准输出流 package com.itheima_05; /* * 标准输入输出流: public static final InputStream