java的新特性反射机制应用及操作示例详解

 更新时间:2023年05月22日 08:43:58   作者:avatar 小强Zzz  
这篇文章主要为大家介绍了java的新特性反射机制的操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

说起发射,先说正射是什么,我们代码中通过User user = new User();代码创建一个对象,并调用User类的成员变量或方法,这种我们通过Class信息获取class实例,称之为正射,这种代码编译器编译时便知道他会生成一个user对象。

如果我们在写代码时不知道我们要操作的对象类型,他可能是User类型,也可能是House类型,而User类型和Clazz类型有没有继承关系,只知道要调用他的getId()方法,那又该怎么调用对象的方法呢?

反射

对于反射而言,我们获得了一个对象的实例,并且知道了这个对象的类型,那么我们便可以对他进行一切操作。

这是由于JVM为每一个加载的class都创建了一个class实例,并保存了实例的所有信息,包括类型,父类,方法,属性等等,这使得我们可以获取class实例的所有信息。
这种通过class实例获取class信息的方法称为反射

获取class又3种方法

通过一个class的静态变量class获取

Class clazz = User.class;

通过完整包路径获取

Class clazz = Class.forName("xiaoqiangZzz.busticket;");

通过实例获取

Object object = getObject();
Class clazz = object.getClass();

获取到class后,我们也可以通过class创建实例对象

Object object = clazz.newInstance();
Object object = clazz.newInstance();

获取属性

  • Field getField(name):根据字段名获取某个public的field(包括父类)
  • Field getDeclaredField(name):根据字段名获取当前类的某个field(不包括父类)
  • Field[] getFields():获取所有public的field(包括父类)
  • Field[] getDeclaredFields():获取当前类的所有field(不包括父类)
public void getId(Object object) throws IllegalAccessException {
    Class clazz = object.getClass();
    Field field = clazz.getField("age");
    field.setAccessible(true);
    System.out.println(field.get(object));
    field.setAccessible(false);
}

类似的,我们可以获取方法并调用

  • Method getMethod(name, Class...):获取某个public的Method(包括父类)
  • Method getDeclaredMethod(name, Class...):获取当前类的某个Method(不包括父类)
  • Method[] getMethods():获取所有public的Method(包括父类)
  • Method[] getDeclaredMethods():获取当前类的所有Method(不包括父类)
public void getMethod(Object object) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
    Class clazz = object.getClass();
    Method method = clazz.getMethod("getId");
    method.invoke(object);
}

反射应用

制作一个通用的数据库表导出方法

public void wirte(Object[] objects, Class classN) throws IllegalAccessException {
        Sheet sheet = new Sheet();
        Field[] fields = classN.getDeclaredFields();
        for (int i = 1; i < objects.length; i++) {
            Row row = sheet.createRow(i);
            for (Field field : fields) {
                field.setAccessible(true);
                // 写入单元格
                ...........
                field.setAccessible(false);
        }
    }

注解获取类

以上就是java的新特性--反射的详细内容,更多关于java的新特性--反射的资料请关注脚本之家其它相关文章!

相关文章

  • jvm调优常用命令行工具详解

    jvm调优常用命令行工具详解

    这篇文章主要介绍了jvm调优常用命令行工具的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • Java多线程之异步Future机制的原理和实现

    Java多线程之异步Future机制的原理和实现

    这篇文章主要为大家详细介绍了Java多线程之异步Future机制的原理和实现,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • SpringBoot实现配置文件加密的方案分享

    SpringBoot实现配置文件加密的方案分享

    项目的数据库密码、redis 密码等明文展示在配置文件中会有潜在的风险,因此采用合适的安全防护措施是有必要的,下面小编就为大家介绍一下SpringBoot中配置文件加密的方法,希望对大家有所帮助
    2023-11-11
  • 详解springboot集成websocket的两种实现方式

    详解springboot集成websocket的两种实现方式

    这篇文章主要介绍了springboot集成websocket的两种实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Java内存模型JMM详解

    Java内存模型JMM详解

    这篇文章主要介绍了Java内存模型JMM详解,涉及volatile和监视器锁,final字段,内存屏障等相关内容,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java 覆盖equals时总要覆盖hashcode

    Java 覆盖equals时总要覆盖hashcode

    这篇文章主要介绍了Java 覆盖equals时总要覆盖hashcode的相关资料,这里附有实例代码,具有参考价值,需要的朋友可以参考下
    2016-12-12
  • SpringCloud集成Micrometer Tracing的代码工程

    SpringCloud集成Micrometer Tracing的代码工程

    Micrometer Tracing 是一个用于微服务架构的追踪库,它提供了一种简单而强大的方式来收集和报告分布式系统中的性能和调用链信息,Micrometer Tracing 旨在帮助开发者和运维人员理解微服务之间的交互,本文给大家介绍了如何在 Spring Cloud 集成 Micrometer Tracing
    2024-12-12
  • Java中stream的用法详细解读

    Java中stream的用法详细解读

    这篇文章主要介绍了Java中stream的用法详细解读,Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作,使用Stream API 对集合数据进行操作,就类似于使用SQL执行的数据库查询,需要的朋友可以参考下
    2023-10-10
  • java POI 如何实现Excel单元格内容换行

    java POI 如何实现Excel单元格内容换行

    这篇文章主要介绍了java POI 如何实现Excel单元格内容换行的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java 数据结构线性表之顺序存储详解原理

    Java 数据结构线性表之顺序存储详解原理

    线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系
    2021-10-10

最新评论