黑马程序员--反射的“魅力”

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

第一讲    类加载器和反射

一、类的加载

   当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。

    加载

    •就是指将class文件读入内存,并为之创建一个Class对象。

    •任何类被使用时系统都会建立一个Class对象。

    连接

    •验证 是否有正确的内部结构,并和其他类协调一致

    •准备 负责为类的静态成员分配内存,并设置默认初始化值

    •解析 将类的二进制数据中的符号引用替换为直接引用

    初始化

二、类初始化时机    

    •创建类的实例

    •访问类的静态变量,或者为静态变量赋值

    •调用类的静态方法

    •使用反射方式来强制创建某个类或接口对应的java.lang.Class对象

    •初始化某个类的子类

•直接使用java.exe命令来运行某个主类

三、类加载器

1、类加载器

•负责将.class文件加载到内在中,并为之生成对应的Class对象。

•我们虽然不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行。

2、类加载器的组成

(1)Bootstrap ClassLoader 根类加载器

根类加载器也被称为引导类加载器,负责Java核心类的加载,比如System,String等。在JDK中JRE的lib目录下rt.jar文件中

(2)Extension ClassLoader 扩展类加载器

扩展类加载器负责JRE的扩展目录中jar包的加载。在JDK中JRE的lib目录下ext目录

(3)Sysetm ClassLoader 系统类加载器

系统类加载器负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径(我们自己写的东西就是用这个加载的)

四、反射

1、反射的定义

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

2、反射的实现

学习反射之前我们要使用类的成员变量、构造方法、成员方法是这样使用的(示例)

学习了反射之后,我们就要通过class文件对象,去使用该类中的成员变量,构造方法,成员方法。要想这样使用,首先必须得到class文件对象,其实也就是Class类的对象。所有的.class文件都是Class类的对象。同时,类中的成员变量、构造方法、成员方法也都变成了一个类

•成员变量   Field

•构造方法   Constructor

•成员方法  Method

通过以上这三个类的对象调方法去使用该方法(或该变量)即为反射。

3、各类的方法解析

(1)   获取Class类对象的方法

public static Class forName(String className)

静态方法通过Class类直接调用,参数是类的名称(注意:这里的类名必须为全路径),建议括号外写类路径,由于有提示不会出现书写错误,再将类全路径复制到相应位置。

(2)   获取Constructor类对象的方法

public Constructor [] getConstructors()
返回所有公共构造方法(用public修饰的)
 
         public Constructor [] getDeclaredConstructors()
         获取所有的构造方法包括私有的构造方法
 
        public Constructor getConstructor
       (Class<?>... parameterTypes)
        例如:public Constructor getConstructor
       (int.class,String.class)
        获取单个带参构造方法对象,参数为可变参数,因为构造方法可能没有参数、或者有一个参数、或者有多少个参数。(不能获取私有构造器)
 
 public Constructor getDeclaredConstructor
(Class<?>... parameterTypes)
        public void setAccessible(boolean flag)
        获取单个带参构造方法对象,参数为可变参数,因为构造方法可能没有参数、或者有一个参数、或者有多少个参数。(可以获取私有构造器)但是需要取消访问检查

(3)   通过Constructor类对象的方法创建示例对象

public Object newInstance()
返回这个类的示例化对象,他的类型是Object,但是他的本质还是原来的类型,是原来类的对象,所以可以使用强制类型转换转回到原来的类型。

(4)获取Field类对象的方法

         public Field[] getFields()
返回所有公共成员变量(用public修饰的)
 
         public Field [] getDeclaredFields ()
         获取所有的成员变量包括私有的成员变量
 
         public Field getField(String name)
         获取单个成员变量(不包括私有的成员变量)
 
         public Field getDeclaredField(String name)
         public void setAccessible(boolean flag)
         获取单个成员变量(包括私有成员变量),参数为该成员变量名,但是需要取消访问检查
 
public Constructor getDeclaredConstructor()
public Object newInstance()
         public void set(Object obj, Object value)
         先通过无参构造创建对象,然后再调用该方法给成员变量赋值
         

(4)   获取Method类对象的方法(不再赘述)

获取所有方法

getMethods

获取自己的包括父亲的公共方法

 

getDeclaredMethods

获取自己的不包括父亲的所有方法

 

获取单个方法

getMethod

getDeclaredMethod

4、使用步骤
A:获取类的字节码文件对象
B:用Class对象调用方法创建Constructor
      	--Constructor对象调用方法创建实例对象
   用Class对象调用方法创建Field
      	--使用B步骤创建实例对象
	--Field对象调用方法(set方法)以上一步实例对象为参数给成员变量赋值
   用Class对象调用方法创建Method
      	--使用B步骤创建实例对象
        --Method对象调用方法(invoke方法)以上一步实例对象为参数(其余参数为原方法的实际参数)调用方法

五、代码实现

1、反射创建实例对象
 
2、反射给成员变量赋值
 
3、反射调用成员方法
 
 
 

 

 

 

 

 

基于SSM框架的智能家政保洁预约系统,是一个旨在提高家政保洁服务预约效率和管理水平的平台。该系统通过集成现代信息技术,为家政公司、家政服务人员和消费者提供了一个便捷的在线预约和管理系统。 系统的主要功能包括: 1. **用户管理**:允许消费者注册、登录,并管理他们的个人资料和预约历史。 2. **家政人员管理**:家政服务人员可以注册并更新自己的个人信息、服务类别和服务时间。 3. **服务预约**:消费者可以浏览不同的家政服务选项,选择合适的服务人员,并在线预约服务。 4. **订单管理**:系统支持订单的创建、跟踪和管理,包括订单的确认、完成和评价。 5. **评价系统**:消费者可以在家政服务完成后对服务进行评价,帮助提高服务质量和透明度。 6. **后台管理**:管理员可以管理用户、家政人员信息、服务类别、预约订单以及处理用户反馈。 系统采用Java语言开发,使用MySQL数据库进行数据存储,通过B/S架构实现用户与服务的在线交互。系统设计考虑了不同用户角色的需求,包括管理员、家政服务人员和普通用户,每个角色都有相应的权限和功能。此外,系统还采用了软件组件化、精化体系结构、分离逻辑和数据等方法,以便于未来的系统升级和维护。 智能家政保洁预约系统通过提供一个集中的平台,不仅方便了消费者的预约和管理,也为家政服务人员提供了一个展示和推广自己服务的机会。同时,系统的后台管理功能为家政公司提供了强大的数据支持和决策辅助,有助于提高服务质量和管理效率。该系统的设计与实现,标志着家政保洁服务向现代化和网络化的转型,为管理决策和控制提供保障,是行业发展中的重要里程碑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值