自学内容网 自学内容网

Java反射

一.类的加载

1 类的加载概述

当我们的程序在运行后,第一次使用某个类的时候,会将此类的class文件读取到内存,并将此类的所有信息存储到一个Class对象中。

2 类的加载时机

  • 创建类的实例。
  • 类的静态变量,或者为静态变量赋值。
  • 类的静态方法。
  • 初始化某个类的子类。
  • 直接使用java.exe命令来运行某个主类。
  • 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象。

3 类加载器

类加载器的作用:

  • 加载器是Java运行时环境的一部分,负责加载字节码文件,即将磁盘上的某个class文件读取到内存并生成Class的对象

类加载器的分类:

  • 启动类加载器(Bootstrap ClassLoader):负责加载JDK核心类库,核心类库位置\jdk\jre\lib\下的jar包。

注意:C++编写的加载器,获取启动类加载器后输出结果是null。

  • 扩展类加载器(Extension ClassLoader):负责加载JDK扩展类库,类库位置\jdk\lib\ext\下的jar包。
  • 应用程序类加载器(Application ClassLoader):负责加载我们自定义类的加载器。

 当一个类的class文件被类加载器加载到内存后,类的加载器会创建出此class文件的对象。class文件的对象是Class类的对象,是反射技术的基石。

获取类加载器的方式:来自Class类型获取类加载器的方法

4 使用类加载器加载配置文件

  • 在src下面新建一个db.properties文件

  • 使用类加载器加载配置文件

二.反射

1 反射概述

  • 反射在实际开发中的应用:

开发IDE(集成开发环境),通过反射技术对象类进行了解剖得到了类的所有成员。
各种框架的设计和学习 比如Spring,Hibernate,Struct,Mybaits....
 

  • 反射的概念:

反射是一种机制,利用该机制可以在程序运行过程中对类进行解剖
并操作类中的所有成员(成员变量,成员方法,构造方法)
在运行时,可以直接得到这个类的构造器对象:Constructor
获取到构造器了,可以做什么? 创建对象
在运行时,可以直接得到这个类的成员变量对象:Field
获取成员方法了,可以做什么? 可以调用方法执行
在运行时,可以直接得到这个类的成员方法对象:Method
获取成员变量了,可以做什么? 赋值、取值
这种运行时动态获取类信息以及动态调用类中成分的能力称为
Java语言的反射机制

  • 使用反射操作类成员的前提

要获得该类字节码文件对象,就是Class对象
利用Class对象,来获取到:构造器、成员方法、成员变量

2 Class对象的获取和常用方法

获取class对象方式作用应用场景
Class.forName("全类名")通过指定的字
符串路径获取
多用于配置文
件,将类名定义
在配置文件中。
读取文件,加载
类名.class通过类名的属
性class获取
多用于参数的传
对象.getClass()通过对象的
getClass()方法
获取
多用于对象的获
取字节码的方式

 

 get  set 方法省约

方法说明
String getSimpleName()获得类名字符串:类名
String getName()获得类全名:包名+类名
T newInstance()创建Class对象关联类的对象

3 反射之操作构造方法

Constructor类概述

Constructor类:类中的每一个构造方法都是一个Constructor类的对象
反射之操作构造方法的目的:获得Constructor对象来创建类的对象。

通过反射获取类的构造方法

Class类中与Constructor相关的方法
1.Constructor[] getConstructors()
        获得类中的所有构造方法对象,只能获得public的
2.Constructor[] getDeclaredConstructors()
        获得类中的所有构造方法对象
        可以是public、protected、(默认)、private修饰符的构造方法。
3.Constructor getConstructor(Class...parameterTypes)
         * 根据参数类型获得对应的Constructor对象。
         * 只能获得public修饰的构造方法
4.Constructor getDeclaredConstructor(Class...
parameterTypes
)
         * 根据参数类型获得对应的Constructor对象
         * 可以是public、protected、(默认)、private修饰符的构造方法。

通过反射执行构造方法

Constructor对象常用方法

1. T newInstance(Object... initargs)根据指定的参数创建对象
2. void setAccessible(true)
设置"暴力反射"——是否取消权限检查,true取消权限检查,false表示不取消

get  set 方法省约

4 反射之操作成员方法

1.Method类概述

Method类:每一个成员方法都是一个Method类的对象。反射之操作成员方法的目的:操作Method对象来调用成员方法。

2 通过反射获取类的成员方法

1.Method[] getMethods();
             获得类中的所有成员方法对象,返回数组,只能获得public修饰的且包含父类的
2.Method[] getDeclaredMethods();
             获得类中的所有成员方法对象,返回数组,只获得本类的,包括public、protected、(默认)、private的
3.Method getMethod(String name,Class...args);
               根据方法名和参数类型获得对应的成员方法对象,只能获得public的
4.Method getDeclaredMethod(String name,Class...args);
根据方法名和参数类型获得对应的成员方法对象,包括public、protected、(默认)、private

3 通过反射执行成员方法

Method对象常用方法
Object invoke(Object obj, Object... args)
                参数一:用obj对象调用该方法
                参数二:调用方法的传递的参数(如果没有就不写)
                返回值:方法的返回值(如果没有就不写)
void setAccessible(true)
             设置"暴力访问"——是否取消权限检查,true取消权限检查,false表示不取消

5 反射之操作成员变量

1 Field类概述

Field类:每一个成员变量都是一个Field类的对象。

反射之操作成员变量的目的:通过Field对象给对应的成员变量赋值和取值

2 通过反射获取类的成员变量

Class类中与Field相关的方法

Field[] getFields();
       获得所有的成员变量对应的Field对象,只能获得public的
Field[] getDeclaredFields();
      获得所有的成员变量对应的Field对象,包括public、protected、(默认)、private的
Field getField(String name);
       根据成员变量名获得对应Field对象,只能获得public修饰
Field getDeclaredField(String name);
      根据成员变量名获得对应Field对象,包括public、protected、(默认)、private的

3 通过反射访问成员变量

void set(Object obj, Object value):赋值
         参数1: 要赋值属性的对象
        参数2: 属性具体的值
Object get(Object obj):取值
        参数: 要获取属性值的对象
        返回值: 属性具体的值
void setAccessible(true);暴力反射,设置为可以直接访问私有类型的属.

get set 省约

三.反射的应用

框架底层:反射+配置文件

  • 在src下创建user.properti

className=com.lzw.demo05.UserServ

  • UserService接口

  • UserServiceImpl实现类

  • 测试类


原文地址:https://blog.csdn.net/2401_86102746/article/details/143780813

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!