写点什么

初识 Java 反射概念和使用

发布于: 2 小时前
初识Java反射概念和使用

前言  大家好,瑞雪后的第一天,每个周一的大家都期待这周五的来临。相信很多小伙伴上周末就两件事,赏雪和看 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;}
@Overridepublic 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 ---");
复制代码


复制代码最后如果你觉得此文对你有一丁点帮助,点个赞。或者可以加入我的开发交流群:1025263163 相互学习,我们会有专业的技术答疑解惑


如果你觉得这篇文章对你有点用的话,麻烦请给我们的开源项目点点 star: https://gitee.com/ZhongBangKeJi/CRMEB不胜感激 !

用户头像

还未添加个人签名 2021.11.02 加入

CRMEB就是客户关系管理+营销电商系统实现公众号端、微信小程序端、H5端、APP、PC端用户账号同步,能够快速积累客户、会员数据分析、智能转化客户、有效提高销售、会员维护、网络营销的一款企业应用

评论

发布
暂无评论
初识Java反射概念和使用