反射机制详情

本文涉及的产品
应用实时监控服务-用户体验监控,每月100OCU免费额度
云原生网关 MSE Higress,422元/月
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 反射机制详情

反射机制详情
6/100
发布文章
weixin_69252724
未选择文件

反射

一、 背景

在之前, 仅仅知道一个类名就可以得到类的信息
例如:

`     1. <servlet class="">/<servlet>
    2. <select id=""  resultType="">
    3. mybatis里的session.getMapper(Mapper绑定的Dao接口)
AI 代码解读

在框架里, 需要创建不同的对象, 所以就需要一个方法, 对不同的类的地址创建对象, 这样框架就以不变应万变

有时候我们知道要创建什么对象, 直接可以new创建就行, 此时我们通过类的Class对象来获取类里的属性方法, 提高代码复用性

二、 概念

反射: 在程序运行过程中,动态获取类的信息,以及创建类的对象, 调用对象的属性方法
作用:动态获取类的信息 

三、. 反射

User.java 通过编译 成User.class
.class文件只要被虚拟机加载到内存里就在堆里被创建出一个Class类对象

通过Class对象可以获取类里的信息

反射就是把类中的各个成分映射成一个个Java对象, 通过Class对象调用他们

四、获取类的class对象

  1. 通过对象名获取

    USer user = new User();

    Class u = user.getClass();

  2. 通过类名.class获取类的Class对象

    Class u2 = User.class();

  3. 通过Class.forName("类名获取")

    Class u3 = Class.forName("com.jwq.reflect.User")

1、通过class对象获取构造方法对象

    //获取公共的构造方法
    Constructor constructor = u1.getConstructor();
    Constructor constructor2 = u1.getConstructor(String.class, int.class, String.class);
    //获取私有的构造方法 也可以获取公共构造
    Constructor constructor3 = u1.getDeclaredConstructor();
    //设置对私有权限的构造方法进行操作
    constructor3.setAccessible(true);
    //通过构造方法来创建对象
    Object user = constructor.newInstance();
    Object user2 = constructor2.newInstance("Nelson",19,"男");
AI 代码解读

2. class对象获取属性对象

     getField("指定字段)
     getDeclaredFields("指定字段")
     getFields()
     getDeclaredFields()
AI 代码解读

可以通过field.set(对象,属性值)来强制封装 , 会打破原有程序的封装性

3. 通过Class对象获取啊方法对象

        Constructor constructor = u.getDeclaredConstructor();
        constructor.setAccessible(true);
        Object user = constructor.newInstance();
        //---------------------------------
        Method setName = u.getMethod("setName", String.class);
        //---------------------------------
        setName.invoke(user, "老铁"); // invoke(对象名,参数值)
AI 代码解读

五、反射优缺点

优点:

  1. 增加代码灵活性,复用性 , 通过使用类的Class对象来对属性方法进行调用 , 如: Mybatis的getMapper(Mapper.class)的动态代理, 可以对任意的类进行操作
  2. 可以在运行期间获取类的属性,方法, 通过反射动态调用修改

缺点:

  1. 反射会对类信息类型的动态解析, 使得程序性能降低
  2. 由于反射可以直接给类的属性赋值, 所以要在安全的情况下使用
  3. 反射可以打破原有的访问权限的限制, 破坏代码的封装性

注意:

要使用反射机制, 那么类里的属性对用的set,get方法都需要是标准名字, 不然会调用不到

反射
一、 背景
在之前, 仅仅知道一个类名就可以得到类的信息
例如:

` 1. /

2. <select id=""  resultType="">
3. mybatis里的session.getMapper(Mapper绑定的Dao接口)
AI 代码解读

在框架里, 需要创建不同的对象, 所以就需要一个方法, 对不同的类的地址创建对象, 这样框架就以不变应万变

有时候我们知道要创建什么对象, 直接可以new创建就行, 此时我们通过类的Class对象来获取类里的属性方法, 提高代码复用性

二、 概念
反射: 在程序运行过程中,动态获取类的信息,以及创建类的对象, 调用对象的属性方法
作用:动态获取类的信息

三、. 反射
User.java 通过编译 成User.class
.class文件只要被虚拟机加载到内存里就在堆里被创建出一个Class类对象

通过Class对象可以获取类里的信息

反射就是把类中的各个成分映射成一个个Java对象, 通过Class对象调用他们

四、获取类的class对象
通过对象名获取

USer user = new User();

Class u = user.getClass();

通过类名.class获取类的Class对象

Class u2 = User.class();

通过Class.forName(“类名获取”)

Class u3 = Class.forName(“com.jwq.reflect.User”)

1、通过class对象获取构造方法对象
//获取公共的构造方法
Constructor constructor = u1.getConstructor();
Constructor constructor2 = u1.getConstructor(String.class, int.class, String.class);
//获取私有的构造方法 也可以获取公共构造
Constructor constructor3 = u1.getDeclaredConstructor();
//设置对私有权限的构造方法进行操作
constructor3.setAccessible(true);
//通过构造方法来创建对象
Object user = constructor.newInstance();
Object user2 = constructor2.newInstance("Nelson",19,"男");

  1. class对象获取属性对象
    getField("指定字段)
    getDeclaredFields("指定字段")
    getFields()
    getDeclaredFields()
    可以通过field.set(对象,属性值)来强制封装 , 会打破原有程序的封装性

  2. 通过Class对象获取啊方法对象

     Constructor constructor = u.getDeclaredConstructor();
     constructor.setAccessible(true);
     Object user = constructor.newInstance();
     //---------------------------------
     Method setName = u.getMethod("setName", String.class);
     //---------------------------------
     setName.invoke(user, "老铁"); // invoke(对象名,参数值)
    
    AI 代码解读

    五、反射优缺点
    优点:

增加代码灵活性,复用性 , 通过使用类的Class对象来对属性方法进行调用 , 如: Mybatis的getMapper(Mapper.class)的动态代理, 可以对任意的类进行操作
可以在运行期间获取类的属性,方法, 通过反射动态调用修改
缺点:

反射会对类信息类型的动态解析, 使得程序性能降低
由于反射可以直接给类的属性赋值, 所以要在安全的情况下使用
反射可以打破原有的访问权限的限制, 破坏代码的封装性
注意:

要使用反射机制, 那么类里的属性对用的set,get方法都需要是标准名字, 不然会调用不到

目录
打赏
0
0
0
0
14
分享
相关文章
|
11月前
|
Java反射-Class对象功能概述及反射案例
Java反射-Class对象功能概述及反射案例
90 1
|
11月前
|
【专栏】Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性
【4月更文挑战第27天】本文探讨了Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性。反射通过Class、Constructor、Method和Field类实现。文中列举了反射的应用场景,如动态创建对象、调用方法、访问属性和处理注解,并提供了相关实例代码演示。
107 4
java接口(实例运用)
java接口(实例运用)
60 0
Java用相同的方法在一个类中实现两个接口哪种接口方法被覆盖?
Java用相同的方法在一个类中实现两个接口哪种接口方法被覆盖?
158 0
一个类的两个接口有同名函数,JAVA如何调用
一个类的两个接口有同名函数,JAVA如何调用
116 0
同样一句代码,在类内调用,跟类外调用结果不同?
同样一句代码,在类内调用,跟类外调用结果不同?
91 0
引用调用
引用调用
128 0
Java中父类和接口或接口和接口中出现同名属性或同名同参数方法时,如何区分(全文干货)
Java中父类和接口或接口和接口中出现同名属性或同名同参数方法时,如何区分(全文干货)
497 0
【Kotlin】接口 ( 声明 | 实现 | 接口方法 | 接口属性 | 接口覆盖冲突 | 接口继承 )(二)
【Kotlin】接口 ( 声明 | 实现 | 接口方法 | 接口属性 | 接口覆盖冲突 | 接口继承 )(二)
311 0
【Kotlin】接口 ( 声明 | 实现 | 接口方法 | 接口属性 | 接口覆盖冲突 | 接口继承 )(一)
【Kotlin】接口 ( 声明 | 实现 | 接口方法 | 接口属性 | 接口覆盖冲突 | 接口继承 )(一)
201 0

云原生

+关注