反射机制详情

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
云原生网关 MSE Higress,422元/月
简介: 反射机制详情

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

反射

一、 背景

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

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

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

有时候我们知道要创建什么对象, 直接可以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,"男");

2. class对象获取属性对象

     getField("指定字段)
     getDeclaredFields("指定字段")
     getFields()
     getDeclaredFields()

可以通过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(对象名,参数值)

五、反射优缺点

优点:

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

缺点:

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

注意:

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

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

` 1. /

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

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

有时候我们知道要创建什么对象, 直接可以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(对象名,参数值)
    

    五、反射优缺点
    优点:

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

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

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

相关文章
|
8月前
|
安全 Java
Java反射-Class对象功能概述及反射案例
Java反射-Class对象功能概述及反射案例
80 1
|
Java
类与接口介绍
在Java中,类和接口是两种重要的概念,用于描述对象的属性和行为。它们是面向对象编程的基础,用于组织和管理代码。 类(Class)是一种模板或蓝图,用于创建对象。它定义了对象的属性和行为。类是Java中最基本的组织单元,所有的对象都是根据类来创建的。类由字段(属性)和方法组成。字段表示对象的状态或属性,而方法表示对象的行为或操作。 以下是一个简单的Java类的示例: ```java public class Person { // 字段 private String name; private int age; // 构造方法 publi
71 0
|
8月前
|
Java
如何在类中实现并调用多个接口中的共享方法。
如何在类中实现并调用多个接口中的共享方法。
64 1
|
数据库
ADO的七个对象详情解读
ADO的七个对象详情解读
185 0
|
8月前
|
SQL Java 数据库连接
JAVAJDBC中常用的接口和类
JAVAJDBC中常用的接口和类
120 0
|
Java
java接口(实例运用)
java接口(实例运用)
50 0
|
Java 编译器
JDK21更新内容:匿名类和实例主方法
JDK21更新内容:匿名类和实例主方法
|
Java C语言
类加载器与反射概述
类加载器与反射概述
149 0
类加载器与反射概述