Java反射概念与使用实例代码

作者:小阿杰 时间:2022-02-24 23:55:40 

目录
  • 前言

  • 反射

    • 基础数据准备

    • 基于反射创建对象

    • 获取反射中的对象

    • 获取类中属性

    • 获取类中的构造方法

    • 获取类中方法

  • 结语

    前言

    大家好,瑞雪后的第一天,每个周一的大家都期待这周五的来临。相信很多小伙伴上周末就两件事,赏雪和看EDG。哈哈 开始正题吧,今天聊一聊反射吧,在java中经常使用。

    反射

    相信刚接触Java的,第一句肯定会问什么是反射呢?反射有什么作用呢?为什么使用反射呢?首先反射是Java的特征之一,项目中Java程序在运行的过程中,自动去识别并创建对应的类,能够动态的调用类的属性、构造方法、类中的方法。一句话描述:在程序中能动态调用不同的类和属性,去执行特定的操作。

    正因为反射能够在运行时动态加载需要的对象,所以很多框架中都使用到了反射。本次为了大家很好的理解反射,将基于反射创建对象、获取反射中的对象、获取类中属性、获取类中的构造方法、获取类中方法几个方面进行介绍,下面开始进入正题。

    基础数据准备

    为了方便演示,创建了一个基础的对象类。并基于他进行本次的介绍。创建的演示类JueJinUser如下,包含四个属性,分别有get和set方法,还有toString方法,没有创建构造方法,下面会介绍通过反射自动创建的相关反射的方法。


    public class JueJinUser {
       private Integer id;

    private String name;

    private String title;

    private Integer age;

    public Integer getId() {
           return id;
       }

    public void setId(Integer id) {
           this.id = id;
       }

    public String getName() {
           return name;
       }

    public void setName(String name) {
           this.name = name;
       }

    public String getTitle() {
           return title;
       }

    public void setTitle(String title) {
           this.title = title;
       }

    public Integer getAge() {
           return age;
       }

    public void setAge(Integer age) {
           this.age = age;
       }

    @Override
       public String toString() {
           return "JueJinUser{" +
                   "id=" + id +
                   ", name='" + name + '\'' +
                   ", title='" + title + '\'' +
                   ", age=" + age +
                   '}';
       }
    }

    基于反射创建对象

    基于反射创建类对象主要有两种方式:第一种是通过类对象的newInstance()方法创建对象,第二种是通过构造器中的 newInstance()方法创建对象。

    类对象的newInstance()方法

      类对象的newInstance()方法创建方法如下:


          Class class = JueJinUser.class;
          JueJinUser jueJinUseByClass = (JueJinUser) class.newInstance();

    构造器的newInstance()方法


           Class jueJinUserClass = JueJinUser.class;
           Constructor constructor = jueJinUserClass.getConstructor();
           JueJinUser jueJinUserByConstructor = (JueJinUser) constructor.newInstance();

    需要注意的是,两种创建方式中第一种基于类对象的newInstance()的方法只能是无参构造方法,而第二种基于构造器的 newInstance()方法可以有有参构造方法和无参构造方法,比较灵活。

    获取反射中的对象

    获取反射对象的方式有三种,分别是:Class.forName、.class 方法和getClass() 方法。获取反射中对象的方法大家在项目中使用的还是比较多的,相信大家都不陌生。

    Class.forName


       Class clzForName = Class.forName("com.example.demo.module.JueJinUser");

    .class 方法


       Class clzForClass =JueJinUserString.class;

    getClass() 方法


       JueJinUser JueJinUser = new JueJinUser();
       Class clzNewObject = str.getClass();

    获取类中属性

    通过getFields和getDeclaredFields的方法,可以获取类中的属性信息,其中getFields可以获取类中的公有属性值,而getDeclaredFields的方法,获取所有类中的属性信息,但是无法获取到父类的信息。格式如下:


           Class clz = JueJinUser.class;
           Field[] fields = clz.getFields();
           System.out.println("--- getFields start ---");
           for (Field field : fields) {
               System.out.println(field.getName());
           }
           System.out.println("--- getFields end ---");

    System.out.println("--- getDeclaredFields start ---");
           Field[] declaredFields = clz.getDeclaredFields();
           for (Field field : declaredFields) {
               System.out.println(field.getName());
           }
           System.out.println("--- etDeclaredFields end ---");

    获取类中的构造方法

    通过getConstructors和getDeclaredConstructors的方法,可以获取类中的构造方法信息,其中getConstructors可以获取类中构造方法,而getDeclaredConstructors的方法,获取所有类中的构造方法,但是无法获取到父类的构造方法信息。格式如下:


        System.out.println("--- getConstructors start ---");
           Constructor[] constructors = clz.getConstructors();
           for (Constructor constructor : constructors) {
               System.out.println(constructor.getName());
           }
           System.out.println("--- getConstructors end ---");

    System.out.println("---getDeclaredConstructors start---");
           Constructor[] declaredConstructors = clz.getDeclaredConstructors();
           for (Constructor constructor : declaredConstructors) {
               System.out.println(constructor.getName());
           }
           System.out.println("---getDeclaredConstructors end---");

    获取类中方法

    通过getMethods和getDeclaredMethods的方法,可以获取类中的构造方法信息,其中getMethods可以获取类中构造方法,而getDeclaredMethods的方法,获取所有类中的方法,但是无法获取到父类的方法信息。格式如下:


        System.out.println("--- getMethods start ---");
           Method[] methods = clz.getMethods();
           for (Method method : methods) {
               System.out.println(method.getName());
           }
           System.out.println("--- getMethods end ---");

    System.out.println("--- getDeclaredMethods start---");
           Method[] declaredMethods = clz.getDeclaredMethods();
           for (Method method : declaredMethods) {
               System.out.println(method.getName());
           }
           System.out.println("--- getDeclaredMethods end ---");

    来源:https://juejin.cn/post/7028194650879967269

    标签:java,反射,概念
    0
    投稿

    猜你喜欢

  • windows 部署JAVA环境安装iDea的详细步骤

    2022-10-09 01:09:26
  • SpringCloud hystrix断路器与局部降级全面介绍

    2023-10-28 17:29:11
  • Spring MVC入门_动力节点Java学院整理

    2023-11-03 20:35:31
  • java锁synchronized面试常问总结

    2023-08-01 05:11:37
  • 详解在Spring中如何自动创建代理

    2023-11-15 15:28:52
  • JAVA中的Token 基于Token的身份验证实例

    2023-11-09 18:05:09
  • iOS实现从背景图中取色的代码

    2023-07-06 15:18:32
  • Mybatis无法获取带有下划线前缀的字段的值问题

    2023-07-20 10:06:33
  • Mybatis-Plus 多表联查分页的实现代码

    2023-11-25 04:59:07
  • JavaFX实现UI美观效果代码实例

    2021-08-27 21:02:15
  • Spring Boot自动配置的原理及@Conditional条件注解

    2021-08-31 21:14:11
  • C#词法分析器之正则表达式的使用

    2023-06-21 13:10:58
  • java 根据经纬度获取地址实现代码

    2023-09-05 04:54:50
  • Java ArrayList源码深入分析

    2023-06-16 16:30:26
  • Spring Boot启动过程全面解析(三)

    2023-09-13 13:16:39
  • android中使用SharedPreferences进行数据存储的操作方法

    2023-06-16 17:37:42
  • Spring Boot详解创建和运行基础流程

    2022-01-28 19:57:05
  • Kotlin之在Gradle中无参(no-arg)编译器插件的使用详解

    2023-07-31 19:11:43
  • java自定义ClassLoader加载指定的class文件操作

    2022-03-16 16:19:07
  • 基于java 线程的几种状态(详解)

    2022-08-31 19:51:47
  • asp之家 软件编程 m.aspxhome.com