【从零开始学习JAVA | 第四十五篇】反射

目录

前言:

​反射:

 使用反射的步骤:

1.获取阶段:

2.使用阶段:

反射的应用场景:

使用反射的优缺点:

总结:


前言:

Java中的反射是一项强大而灵活的功能,它允许程序在运行时动态地获取、操作和利用类的信息。通过反射,我们可以在运行时检查和修改类的属性、调用类的方法,甚至创建和操作对象实例。这种能力为Java提供了很多灵活性和扩展性,使得我们能够编写更加通用、可插拔和动态的代码。然而,反射也是一种高级特性,需要谨慎使用,因为它可能牺牲了一些性能和类型安全性。在本文中,我们将深入探究Java反射的原理、用法和最佳实践。

反射:

                反射是一种在运行时动态获取、检查和操作类的信息的能力。它允许程序在运行时通过类的名称获取其完整结构,并可以实例化对象、调用方法、访问属性和执行其他与类相关的操作,而无需在编译时明确引用这些类。反射的核心是java.lang.reflect包,它提供了一组类和接口,用于实现反射功能。使用反射,可以实现一些灵活和通用的编程技术,如动态加载类、配置文件解析、框架扩展和代码生成。然而,反射也会带来性能上的开销,并且破坏了编译时类型检查,因此在使用时需要注意适度和合理性。

也就是说:反射可以把类中的成员变量,成员方法和构造方法单独拿出来进行访问,我们是否会好奇我们自定义类之后,idea为什么会有提示功能?

其实这就是通过反射来实现的。 

 使用反射的步骤:

1.获取阶段:

在获取阶段,我们使用反射机制来获取与类、方法、字段等相关的信息。这包括获取类的Class对象构造方法方法字段等,并可以检查类的继承关系、接口实现以及注解等元数据信息。获取阶段提供了对类结构的探索和解析的能力,让我们能够动态地获取类的结构信息。

(1)利用反射获取class对象

public class test01 {public static void main(String[] args) throws ClassNotFoundException {//获取class文件://第一种Class<?> aClass = Class.forName("Myrflect.student");System.out.println(aClass);//第二种:Class<student> studentClass = student.class;System.out.println(studentClass);//第三种:student st = new student();Class<? extends student> aClass1 = st.getClass();System.out.println(aClass1);}
}

(2)利用反射获得构造方法

public class getcontrbute {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {//1.获取字节码文件对象Class<?> aClass = Class.forName("Myrflect.student");//1.获取公共的构造方法:Constructor<?>[] constructors = aClass.getConstructors();for (Constructor<?> constructor : constructors) {System.out.println(constructor);}System.out.println("-------------------------");//2.获取私有的构造方法Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();for (Constructor<?> cons : declaredConstructors) {System.out.println(cons);}System.out.println("-------------------------");//3.获取单个的构造方法Constructor<?> declaredConstructor = aClass.getDeclaredConstructor();System.out.println(declaredConstructor);Constructor<?> declaredConstructor1 = aClass.getDeclaredConstructor(String.class,int.class,String.class);System.out.println(declaredConstructor1);}
}

(3)反射获取成员变量

public class getmember {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {//1.获取Class字节码文件对象Class<?> aClass = Class.forName("Myrflect.student");//1.获取所有公告成员变量对象的数组Field[] fields = aClass.getFields();for (Field field : fields) {System.out.println(field);}System.out.println("---------------");//2.获取所有成员变量对象的数组Field[] declaredFields = aClass.getDeclaredFields();for (Field field : declaredFields) {System.out.println(field);}System.out.println("---------------");//3.获取单个成员变量Field name = aClass.getField("name");System.out.println(name);}
}

 (4)反射获取成员方法

public class getway {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {Class<?> aClass = Class.forName("Myrflect.student");//1.获取所有公共方法对象(包含父类,而每一个类都继承Object类,因此打印会出现很多方法)Method[] methods = aClass.getMethods();for (Method method : methods) {System.out.println(method);}System.out.println("-----------------------------");//2.获取所有方法对象(不包含父类)Method[] declaredMethods = aClass.getDeclaredMethods();for (Method method : declaredMethods) {System.out.println(method);}System.out.println("-----------------------------");//3.获取单个方法Method method = aClass.getMethod("getAge");System.out.println(method);}
}

2.使用阶段:

在获取了类的结构信息后,我们可以使用反射机制来动态地实例化对象、调用方法、访问字段等操作。使用阶段利用获取阶段得到的信息,通过反射来操作类的成员,实现灵活、通用和动态的功能。使用阶段可以根据实际需求来动态地操作类的成员,而无需在编译时提前确定具体的类和成员。

public class ReflectionExample {public static void main(String[] args) {try {// 读取和写入字段MyClass obj = new MyClass();Class<?> clazz = obj.getClass();// 获取公共字段Field publicField = clazz.getField("publicField");System.out.println("Public Field Initial Value: " + publicField.get(obj));// 设置字段的值publicField.set(obj, "New Value");System.out.println("Public Field Updated Value: " + publicField.get(obj));// 获取私有字段Field privateField = clazz.getDeclaredField("privateField");privateField.setAccessible(true); // 设置私有字段可访问System.out.println("Private Field Initial Value: " + privateField.get(obj));// 设置私有字段的值privateField.set(obj, 123);System.out.println("Private Field Updated Value: " + privateField.get(obj));// 调用方法Method method = clazz.getMethod("publicMethod");method.invoke(obj); // 执行公共方法// 创建对象Constructor<?> constructor = clazz.getConstructor();Object newObj = constructor.newInstance();System.out.println("New Object: " + newObj);} catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException | InvocationTargetException | InstantiationException e) {e.printStackTrace();}}
}

反射还提供了许多其他功能,如获取类的构造方法、接口、父类,获取注解信息等。

需要注意的是,使用反射时要注意权限的限制(如私有成员的访问)以及性能问题(反射操作比直接调用性能较差)。另外,运用反射应尽量遵循设计原则,避免滥用反射,保证代码的可读性和可维护性。

反射的应用场景:

  1. 框架开发:反射常被用于框架的开发,通过读取配置文件或注解来动态地加载类、创建对象、调用方法和访问字段,从而实现灵活可扩展的框架结构。

  2. 对象实例化:通过反射可以实现动态地创建对象实例。通过类的Constructor对象可以调用不同的构造方法,为对象传递不同的参数,从而根据需要来创建对象。

  3. 调用方法和访问字段:反射可以用于调用类的方法和访问类的字段。通过方法的Method对象可以调用类的不同方法,通过字段的Field对象可以读取和写入类的字段值。

  4. 探索类的信息:通过反射可以获取类的详细信息,如类名、父类、接口、方法和字段等。这对于编写通用的代码和进行类似于文档生成、序列化和验证等操作非常有用。

  5. 动态代理:反射在实现动态代理时发挥了重要作用。通过反射可以动态地生成代理类,并在代理类的方法调用中添加额外的逻辑,如日志记录、权限验证等。

  6. 单元测试:反射可以用于编写单元测试时的Mock对象。通过反射可以创建假对象并模拟实际对象的行为,从而进行更全面的单元测试。

使用反射的优缺点:

优点:

  1. 动态性:反射提供了在运行时动态获取和操作类的能力。可以动态地创建对象、调用方法和访问字段,这使得代码更具灵活性和可扩展性。

  2. 通用性:通过反射可以编写通用的代码,不依赖于具体的类和接口。可以在不了解类结构的情况下获取类的信息,并根据需要来操作类的成员。

  3. 框架支持:反射被广泛应用于框架的开发,框架可以通过读取配置文件或注解来动态加载类和创建对象,从而实现灵活可配置的框架结构。

  4. 灵活性:反射使得可以在运行时根据条件来动态地选择和执行代码,而不是在编译时进行静态绑定。这在某些特定的业务场景下非常有用。例如,根据配置文件动态选择不同的实现类。

缺点:

  1. 性能开销:反射通常比直接调用代码要慢,因为它需要进行额外的查找、检查和调用。反射调用的性能开销相对较高,可能对性能敏感的应用程序需要谨慎使用。

  2. 安全性问题:使用反射可以绕过类的访问控制和安全检查机制,这可能导致安全漏洞。因此,在使用反射时,需要保证代码的安全性,并确保只有受信任的代码可以访问敏感操作。

  3. 编译器检查缺失:反射可以让代码更加动态,但也会失去编译器在代码编译阶段进行错误检查的能力。一些错误可能在运行时才能被发现,增加了调试的困难性。

总结:

反射是Java中的一项强大功能,通过它我们可以在运行时动态地获取和操作类的成员。使用反射可以实现灵活性、通用性和动态性,提供了诸如创建对象、调用方法和访问字段等功能。然而,反射也有一些缺点,如性能开销和安全性问题。因此,在使用反射时需要权衡利弊,确保使用安全可靠,并遵循最佳实践。总之,反射为Java程序提供了更大的灵活性和扩展性,使代码编写更加通用且适应动态变化的需求。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1380975.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

1688采源宝的商家靠谱吗 怎么入驻成为阿里采源宝商家

说到采源宝&#xff0c;我想很多微商都是不陌生的&#xff0c;采源宝的主要作用就是方便微商查看并转发供应商所发布的商品&#xff0c;并在有客户下单时&#xff0c;还可以轻松向供货商去下单。但也有很多朋友对采源宝的商家靠谱吗这个问题存在很大疑惑&#xff0c;下面我们就…

开发nft数字藏品平台合法合规吗?

开发nft数字产品平台合法合规吗&#xff1f;这是很多人都在问的问题&#xff0c;那么今天就来给大家说说。 开发nft数字产品平台可以肯定的是合法合规。 其实很多人对国内国外的玩法不太了解&#xff0c;有很多人对数字产品法律和政策不太清楚。首先&#xff0c;我们要了解国内…

最近发现一款拍卖转拍,玩家互动挑选自己想要的拍品,转拍获利,还可以提货的源码,一款购物和赚钱的不二选择

拍卖转拍,玩家互动挑选自己想要的拍品,转拍获利,还可以提货,一款购物和赚钱的不二选择操作步骤打开拍卖首页 根据时间点击进入指定的场次选作品&#xff0c; 等待到时间准备抢拍, 抢完之后可以查看卖家的收款码, 确认打款之后可以上传支付截图 然后可以等待卖家确认收货, …

1688按图搜索商品(拍立淘)获取数据的教程

onebound.1688.item_search_img 获取key和secret API文档说明 完整返回数据 "items": { "real_total_results": 80, "error": "", "item": [ { "title"…

基于java SSM框架的竞拍系统拍卖网设计

今天给大家介绍一个竞拍网的设计与实现。 本项目主要实现的功能是为广大的消费者群体与商家之间提供网络交易的平台&#xff0c;实现该平台的创建需要实现一系列的功能。 商品信息发布的功能&#xff0c;商家发布自己产品的相关信息&#xff1b;注册登录功能&#xff0c;游客通…

Java基于ssm开发的古董竞标拍卖系统也可以改成拍卖品网站

简介 古董展品拍卖网站 用户可以注册成为买家也可以申请开店成为卖家&#xff0c;发布古董展品&#xff0c;设置拍卖起止时间进行展品的拍卖。如果早于拍卖开始时间或者晚于拍卖结束时间&#xff0c;则不可以竞拍。多人竞拍&#xff0c;买家可以根据最高价设置谁中标&#xff…

星球日报|Conflux支持 阿里上线国内最大数字藏品交易撮合平台

转载自Odaily星球日报 近日&#xff0c;阿里拍卖在淘宝 APP 首屏重要入口位置上线了一大批第三方公链以及平台支持的数字藏品店铺&#xff0c;以供用户进行拍卖交易。除由公链 Conflux 支持的数字藏品外&#xff0c;阿里拍卖同时存在由国产联盟链“知信链”和“新版链”技术支持…

带有反爬虫机制下进行爬取数据方案,这里以阿里拍卖为例

介绍 最近接到一个2万多的小项目,需求是这样的。需要将一个大型网站上的数据爬下来保存到本地。具体项目不方便透漏,这里的演示就以阿里拍卖网站为例。 反爬虫机制有那些? 解决反爬虫之前,我们首先得了解反爬虫机制。 ip限制反爬虫:免登录反爬虫一般用访问ip来判断你是…

SSM框架在线拍卖系统项目

文章目录 前言一、项目设计具体任务和要求二、数据库设计三、页面效果及功能展示1. 拍卖系统登录页面2.拍卖系统注册页面3.拍卖系统登录后主页面4.拍卖系统游客浏览拍卖商品页面5.拍卖系统用户添加拍卖商品页面6.拍卖系统用户查看个人上传商品页面7.拍卖系统用户删除个人商品页…

类似京东淘宝寄售转拍系统源码-拍卖系统源码-竞拍系统网站源码

古玩文物字画寄售转拍系统源码-拍卖系统源码-竞拍系统网站源码(经检查代码不加密&#xff0c;可二进行二开)&#xff0c;拍卖转拍,玩家互动挑选自己想要的拍品,转拍获利,还可以提货,一款购物和赚钱的不二选择操作步骤打开拍卖首页 根据时间点击进入指定的场次选作品&#xff0…

基于 CentOS 7 构建 LVS-DR 群集 配置nginx负载均衡

环境配置&#xff1a; RHCE客户机192.168.100.146node1lvs192.168.100.145node2RS192.168.100.147node3RS192.168.100.148 配置ipvsadm httpd&#xff1a; [rootnode1 ~]# yum install ipvsadm.x86_64 [rootnode2 ~]# yum install http -y [rootnode2 ~]# systemctl …

通过淘宝司法拍卖购买房子,需要注意些什么?

&#xfeff;&#xfeff; https://www.zhihu.com/question/29996231 通过淘宝司法拍卖购买房子&#xff0c;需要注意些什么&#xff1f; 最近在淘宝网上看到司法拍卖的一套房子&#xff0c;地理位置&#xff0c;房屋质量都比较合适&#xff01;关键是价格比市场价低三四十万…

百度竞价托管靠谱吗

很多客户在找百度竞价托管公司时&#xff0c;往往会有一些疑虑&#xff0c;我花了钱&#xff0c;让别人来优化推广账户&#xff0c;会不会不靠谱呢&#xff1f;这个钱白花了怎么办&#xff1f;就算不是钱的问题&#xff0c;耽误我的事儿啊&#xff0c;耽误公司业绩呀。敖游想说…

使用Jsoup技术获取`阿里拍卖`中法院拍卖的所有拍卖品

文章目录 前言最终效果效果演示爬取所有记录根据条件爬取 项目仓库 项目前准备技术选型开发工具用到的jar包 爬取所有数据页面分析第一步&#xff1a;获取所有省份列表 代码实现进入主页解析页面获得所有省的文档模型循环&#xff0c;获取各省的信息获得市列表获得总页数和翻页…

阿里资产 法拍逆向 sign加密 爬虫

阿里法拍仅仅只需要解决sign值加密即可。 sign 全局搜素sign:,进行多处断点&#xff0c;刷新页面&#xff0c;可以发现sign加密参数以及加密方法。 有经验的可以看出sign值是进行md5加密&#xff0c;可以使用js或python模拟加密&#xff0c;也可以直接将p函数扣下来。 加密参数…

阿里拍卖全链路导购策略首次揭秘

拍卖&#xff0c;是一个大家熟悉的词汇&#xff0c;但对在线拍卖以及在线拍卖的个性化推荐&#xff0c;大家可能不那么熟悉。本文将对阿里拍卖业务背景先做介绍&#xff0c;进而描述业务中的浅库存约束及拍品冷启动问题&#xff0c;并分别提出经线上AB实验验证的解法&#xff0…

拍卖网站开发新风潮?阿里的拍卖平台正在这么做

如今&#xff0c;线上拍卖成为新的风潮、司法拍卖火爆&#xff0c;网络拍卖将成为下一个电商市场&#xff0c;拍卖网站开发新风潮。 学霸的高分笔记值多少钱?1897年的可口可乐运货单你感兴趣吗?井柏然写的三行情书怎么卖?一个大学生把他的脑门当作广告位&#xff0c;你会出价…

WebMagic抓取阿里司法拍卖信息

1、 引入pom文件 <!--webmagic网络爬虫--><dependency><groupId>us.codecraft</groupId><artifactId>webmagic-core</artifactId><version>0.7.3</version></dependency><dependency><groupId>us.codecraft…

csdn添加自定义栏目,公众号二维码等

准备好要添加的公众号二维码&#xff0c;如博主左边的栏目的二维码通过写博客里的图片上传将公众号二维码上传到csdn&#xff0c;将图片地址复制下来&#xff08;只需域名和路径名即可&#xff0c;不要&#xff1f;后面的各种参数&#xff09;在博客管理 -> 栏目管理 -> …

python使用matplot库绘图颜色表

matlpot的color参数可以是十六进制&#xff0c;也可以是颜色描述的字符串。 下面是字符串描述的颜色表。为了颜色间要有区分度。同时要求颜色比较明显&#xff0c;特意选择一些比较有代表性的颜色&#xff0c;以供使用&#xff08;颜色由于个人需要&#xff0c;除去了红色和绿…