反射的作用( 越过泛型检查 和 可以使用反射保存所有对象的具体信息 )

这篇具有很好参考价值的文章主要介绍了反射的作用( 越过泛型检查 和 可以使用反射保存所有对象的具体信息 )。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、绕过 编译阶段 为集合添加数据

  • 反射是作用在运行时的技术,此时集合的泛型将不能产生约束了,此时是可以 为集合存入其他任意类型的元素的
  • 泛型只是在编译阶段可以约束集合只能操作某种数据类型,在 编译成Class文件进入 运行阶段 的时候,其真实类型都是不带泛型的集合,泛型相当于被擦除了。
package com.csdn.d6_reflect_genericity;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
public class ReflectDemo {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //需求:反射实现泛型擦除后,加入其他类型的元素
        ArrayList<String> list1 = new ArrayList<>();
        ArrayList<Integer> list2 = new ArrayList<>();

        System.out.println(list1.getClass());//class java.util.ArrayList
        System.out.println(list2.getClass());//class java.util.ArrayList

        System.out.println(list1.getClass() == list2.getClass());//true

        System.out.println("===============================");

        ArrayList<Integer> list3 = new ArrayList<>();
        list3.add(23);
        list3.add(22);

        Class<? extends ArrayList> aClass = list3.getClass();

        Method add = aClass.getDeclaredMethod("add", Object.class);
        boolean rs = (boolean) add.invoke(list3, "反射");
        System.out.println(rs);//true

        System.out.println(list3);//[23, 22, 反射]

        ArrayList list4 = list3;
        list4.add("注解");
        list4.add(false);
        System.out.println(list3);//[23, 22, 反射, 注解, false]

    }
}

1.1、反射为何可以给约定了泛型的集合存入其他类型的元素?

  • 编译成Class文件进入运行阶段 的时候,泛型会自动擦除
  • 反射是作用在 运行时 的技术,此时已经不存在泛型了 。

 2、通用框架的底层原理

需求

  • 给定任意一个对象,在不清楚对象字段的情况下,可以把对象的字段名称和对应值存储到文件中去。

分析

  1. 定义一个 方法 ,可以接收任意类的对象
  2. 每次收到一个对象后,需要解析这个对象的 全部成员变量名称
  3. 这个对象可能是 任意 的,那么怎么样才可以知道这个对象的全部成员变量名称呢
  4. 使用 反射 获取对象的 Class类对象 ,然后获取全部成员变量信息
  5. 遍历成员变量信息,然后提取本成员变量在对象中的 具体值
  6. 存入成员变量名称和值到 文件 中去即可
package com.csdn.d7_reflect_framework;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;
/**
 * 目标:提供一个通用框架,支持保存所有对象的具体信息。
 */
public class ReflectDemo {
    public static void main(String[] args) {
        Student student = new Student("反射", '男', 100, "JavaSE", "暴力访问");
        MybatisUtil.save(student);

        Teacher teacher = new Teacher("注解", '女', 10000);
        MybatisUtil.save(teacher);
    }
}

class MybatisUtil {
    public static void save(Object object) {
        try {
            try (PrintStream ps = new PrintStream(new FileOutputStream("reflect\\src\\main\\java\\com\\csdn\\d7_reflect_framework\\object.txt",true))) {
                //1、提取这个对象的全部成员变量:只能反射可以解决
                Class<?> aClass = object.getClass();
                ps.println("==============" + aClass.getSimpleName() + "================");

                //2、提取它的全部成员变量
                Field[] fields = aClass.getDeclaredFields();
                //3、获取成员变量的信息
                for (Field field : fields) {
                    String name = field.getName();
                    //提取本成员变量的object对象中的值(取值)
                    field.setAccessible(true);

                    String value = field.get(object) + "";

                    ps.println(name + "=" + value);

                }
            }
        } catch (IllegalAccessException | FileNotFoundException e) {
            throw new RuntimeException(e);
        }

    }
}

@Data
@AllArgsConstructor
@NoArgsConstructor
class Student {
    private String name;
    private char sex;
    private int age;
    private String className;
    private String hobby;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
class Teacher {
    private String name;
    private char sex;
    private double salary;
}

 反射的作用( 越过泛型检查 和 可以使用反射保存所有对象的具体信息 ),# 反射 和 注解,反射,getClass(),invoke()文章来源地址https://www.toymoban.com/news/detail-721755.html

 3、反射的作用?

  • 可以在运行时得到一个 类的 全部成分 然后操作
  • 可以 破坏封装性(很突出)
  • 也可以 破坏泛型的约束性(很突出)
  • 更重要的用途是适合:做 Java 高级框架

到了这里,关于反射的作用( 越过泛型检查 和 可以使用反射保存所有对象的具体信息 )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Scala中的类型检查和转换,以及泛型,scala泛型的协变和逆变

    说明 (1) obj.isInstanceOf[T]:判断 obj 是不是T 类型。 (2) obj.asInstanceOf[T]:将 obj 强转成 T 类型。 (3) classOf 获取对象的类名。 案例 1.说明 (1)枚举类:需要继承 Enumeration (2)应用类:需要继承App 2. 案例 1.说明 使用 type 可以定义新的数据数据类型名称,本质上就

    2024年02月10日
    浏览(28)
  • spring boot 使用AOP+自定义注解+反射实现操作日志记录修改前数据和修改后对比数据,并保存至日志表

    使用FieldMeta自定义注解,看个人业务自行觉得是否需要重新定义实体 实现类 :通过该实现类获取更新前后的数据。 该实现类的实现原理为:获取入参出入的id值,获取sqlSessionFactory,通过sqlSessionFactory获取selectByPrimaryKey()该方法,执行该方法可获取id对应数据更新操作前后的数

    2024年01月23日
    浏览(40)
  • 使用JavaScript实现保存文件,用户可以自己选择本地路径

    但是,此API目前仍处于实验阶段,可能并不在所有浏览器中都得到完全支持。 浏览器的权限是很低的,是不能与操作系统实现交互,只有少量的api可以与操作系统交互,例如文件上传。但是,软件是有很高的权限的,例如,迅雷下载就可以轻松实现,下载到指定目录。 但是

    2024年02月03日
    浏览(39)
  • String、反射、枚举、lambda表达式以及泛型进阶(数据结构系列16)

    目录 前言: 1. String 1.1 字符串常量池 1.1.1 创建对象的思考 1.1.2 字符串常量池(StringTable) 1.1.3 再谈String对象创建 1.1.4 intern方法 2. 反射 2.1 反射的定义 2.2 反射的用途 2.3 反射的基本信息 2.4 反射相关的类 2.4.1 Class类(反射机制的起源) 2.4.1.1 Class类中的相关方法 2.5 反

    2024年02月11日
    浏览(40)
  • 反射的作用

    获取一个类里面所有的信息,获取到了之后,再执行其他的业务逻辑 结合配置文件,动态的创建对象并调用方法 准备一个info.properties文件,以键值对的形式存储 以后若要运行其他类里面的方法,在文件内修改数据即可 将文件修改为如下,再次运行 总结:

    2024年02月19日
    浏览(30)
  • C++ 使用 GDI+ 实现格式为bmp的图像内存转为jpg格式,并且可以实现旋转保存

    将获取的bmp内存数据,经过转换成jpg格式,根据自己的需求可以对图像先做旋转,再进行保存,主要用到的是GDI+工具。 函数的说明 /// /获取的图像内存数据 /// /图像的像素位数 /// /图像的宽度 /// /图像的高度 /// /图像保存的路径 /// /图像保存的路径加图像名称 ///

    2024年02月16日
    浏览(28)
  • Java 中的泛型是什么,它有什么作用?(十五)

    Java中的泛型是一种类型参数化机制,它使代码更具可读性、可重用性和稳健性。在Java中,通过使用泛型,可以将类型作为参数传递给类或方法,并在编译时执行类型检查,从而避免许多运行时错误。 泛型的基础 Java泛型的基础概念是类型变量、类型参数和类型边界。 类型变

    2024年02月03日
    浏览(28)
  • vitepress项目使用github的action自动部署到github-pages中,理论上可以通用所有

    .githubworkflowsdeploy.yml 完整的代码:使用的是 pnpm 进行依赖安装。 这段 YAML 文件定义了一个 GitHub Actions 工作流,用于在推送到 docs 分支时构建和部署 VitePress 项目。 on : 定义触发工作流的事件,这里是在推送到 docs 分支时触发。 jobs : 定义工作流中的任务。 build-and-deploy : 任务

    2024年01月17日
    浏览(40)
  • python3 强制使用任意父级相对导入,越过python相对导入限制,拒绝 ImportError

    单纯不喜欢 python 对 点开头的包的限制,好麻烦,遂写了本包,来解决这个问题 启用本模块后,你可以随时使用 单个点来导入当前目录的模块,也可以使用多个 点导入多级父目录内的模块,而不会报错烦人的模块相对路径限制错误。 写了一个强制相对导入特性,修改了 i

    2024年02月01日
    浏览(32)
  • 题目:1893.检查是否区域内所有整数都被覆盖

    ​​ 题目来源:         leetcode题目,网址:1893. 检查是否区域内所有整数都被覆盖 - 力扣(LeetCode) 解题思路:        start 和 end 的取值范围是 1- 50,因此可以使用比特位位数为 64 的 Long 来表示,第 i 位为 1表示 i 在范围内,否则不在。          获得范围后,通过逻辑

    2024年02月12日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包