Java的反射(reflection)机制的简单使用

目录

一、定义

二、用途

三、反射基本信息

四、反射相关的类

五、反射示例

六、反射的优点和缺点


一、定义

        Java的反射机制是运行时的状态,可以通过反射来调用类里面的属性和方法私有的属性和方法也可以调用,也可以对它们进行修改


二、用途

        (1)、在第三方应用开发过程,经常会遇到私有的成员变量和方法或是只对系统应用开放,这式就能用反射机制拿到这些私有的成员变量和方法。

(2)、开发各种通用框架。


三、反射基本信息

        Java程序中许多对象在运行时会两种类型,一种是编译时类型,一种运行时类型,比如:

Person p = new Student();  这种情况下,p在编译时的类型是Person,在运行时是Student,程序在运行时需要知道它的类型和对象,Java的反射程序可以判断该对象和类属于哪一类


四、反射的相关类

(1)、获得类相关的方法

(2)、获得类中属性的方法

(3)、获得类中注解的方法

(4)、获得类中构造器相关方法

(5)、获得类中方法的方法


五、反射的示例

(一)、获得class对象的三种方式,第一种最常用

我们在创建一个包demo1,里面再创建一个Student类,如图

Student类代码:

class Student{//私有属性nameprivate String name = "bit";//公有属性agepublic int age = 18;//不带参数的构造方法public Student(){System.out.println("Student()");}private Student(String name,int age) {this.name = name;this.age = age;System.out.println("Student(String,name)");}private void eat(){System.out.println("i am eat");}public void sleep(){System.out.println("i am sleep");}private void function(String str) {System.out.println(str);} @Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

代码示例:

public class Test {public static void main(String[] args) {//获得class对象的三种方式//第一种try {Class.forName("demo1.Student");} catch (ClassNotFoundException e) {e.printStackTrace();}//第二种Class<?> c2 = Student.class;//第三种Student student = new Student();Class c3 = student.getClass();}
}

(二)、反射的使用

(1)、创建对象

                代码示例:
public class Test {public static void main(String[] args) {//获得class对象的三种方式//第一种try {Class.forName("demo1.Student");} catch (ClassNotFoundException e) {e.printStackTrace();}//第二种Class<?> c2 = Student.class;//第三种Student student = new Student();Class c3 = student.getClass();}
}
        拿到Student类的对象
//第一种try {Class<?>ClassStudent = Class.forName("demo1.Student");Student student = (Student)ClassStudent.newInstance();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);}

(2)、反射私有的构造方法

             代码示例:
    public static void reflectNewInstance() {//反射私有的构造方法try {//先拿到一个类Class<?> classStudent = Class.forName("demo1.Student");//调用构造方法Constructor<?> constructor = classStudent.getDeclaredConstructor(String.class, int.class);//私有的属性name需要你确认才能更改constructor.setAccessible(true);Student student = (Student) constructor.newInstance("xiaoming", 15);System.out.println(student);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);} catch (NoSuchMethodException e) {throw new RuntimeException(e);} catch (InvocationTargetException e) {throw new RuntimeException(e);}}

调用这个代码后现象:

(3)、反射私有属性

                代码示例:

                

public static void reflectPrivateField() {//反射私有属性try {Class<?> classStudent = Class.forName("demo1.Student");Field field = classStudent.getDeclaredField("name");field.setAccessible(true);Student student = (Student)classStudent.newInstance();field.set(student, "caocao");System.out.println(student);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchFieldException e) {throw new RuntimeException(e);} catch (InstantiationException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);}}

调用这个代码后现象:

(4)、反射私有方法

                代码示例:
public static void reflectPrivateMethod() {//反射私有方法try {Class<?> classStudent = Class.forName("demo1.Student");Method method = classStudent.getDeclaredMethod("function");method.setAccessible(true);Student student = (Student)classStudent.newInstance();method.invoke(student, "我是一个反射参数");} catch (ClassNotFoundException e) {throw new RuntimeException(e);} catch (InstantiationException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);} catch (NoSuchMethodException e) {throw new RuntimeException(e);} catch (InvocationTargetException e) {throw new RuntimeException(e);}}

六、反射的优点和缺点

优点:1、对任意类的成员变量或方法都能调用,对于任意一个对象,都能调用它的方法,封装就不起到作用了。

           2、运用于很多流行的框架(Struts、Hibernate、Spring 等等)。

           3、增强程序的灵活性和扩展性。

缺点:1、效率问题,使用反射程序会导致程序效率低。

           2、因功能太过强大,维护起来也比较麻烦,反射代码相对于普通代码也更复杂。


都看到这里了,点个赞再走呗,谢谢谢谢谢!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见面试题-Netty专栏(一)

typora-copy-images-to: imgs Netty 是什么呢&#xff1f;Netty 用于做什么呢&#xff1f; 答&#xff1a; Netty 是一个 NIO 客户服务端框架&#xff0c;可以快速开发网络应用程序&#xff0c;如协议服务端和客户端&#xff0c;极大简化了网络编程&#xff0c;如 TCP 和 UDP …

LVS+keepalived高可用集群

1、定义 keepalived为lvs应运而生的高可用服务。lvs的调度器无法做高可用&#xff0c;keepalived实现的是调度器的高可用&#xff0c;但keepalived不只为lvs集群服务的&#xff0c;也可以做其他代理服务器的高可用&#xff0c;比如nginxkeepalived也可实现高可用&#xff08;重…

多模态笔记

Transformer 对文本输入进行tokenizer时&#xff0c;调用的接口batch_encode_plus&#xff0c;过程大致是这样的(参考&#xff1a;tokenizer用法) #这里以bert模型为例&#xff0c;使用上述提到的函数 from transformers import BertTokenizer tokenizer BertTokenizer.from…

spring tx:advice事务配置—— tx:advice中不允许出现属性 ‘transaction-manager‘

今天在配置java事务管理时出现了一些问题。 提示&#xff1a;只有这几个属性 经过查询资料发现是bean的配置少了一些。 可以在xml文件顶部添加&#xff1a; xmlns:tx"http://www.springframework.org/schema/tx" 下面也提供一份bean文件配置的模板&#xff1a; &a…

下列软件包有未满足的依赖关系: libqt5svg5-dev : 依赖: libqt5svg5 (= 5.12.8-0ubuntu1) 但是它将不会被安装

有一些软件包无法被安装。如果您用的是 unstable 发行版&#xff0c;这也许是 因为系统无法达到您要求的状态造成的。该版本中可能会有一些您需要的软件 包尚未被创建或是它们已被从新到(Incoming)目录移出。 下列信息可能会对解决问题有所帮助&#xff1a; 下列软件包有未满足…

Java入门讲解(1)---让你瞬间明白如何安装jdk

博主有话说&#xff1a;学习这个东西一定要持之以恒&#xff01;&#xff01;&#xff01;博主之前因为点事情半个月没学习&#xff0c;重新来过时&#xff0c;发现自己错过好多知识&#xff0c;正在一点一点往回补&#xff0c;博客也会陆续开始更新&#xff0c;希望大家多多支…

HarmonyOS SDK,赋能开发者实现更具象、个性化开发诉求

#鸿蒙生态千帆起#随着移动互联网的逐步成熟&#xff0c;用户的需求越来越细化。鸿蒙生态为开发者提供的HarmonyOS SDK开放能力&#xff0c;高效赋能美团外卖等合作伙伴实现更具象、个性化的开发诉求&#xff0c;给用户提供更丰富便捷的体验。 HarmonyOS SDK&#xff0c;赋能开发…

pb:数据处理窗口CloseQuery事件编程、如何在窗口之间传递结构

1、数据处理窗口CloseQuery事件编程 该事件下的脚本流程是首先判断数据是否修改过,如果修改过,则让用户选择是否保存,用户确认保存则保存,不保存则退回事务然后关闭窗口。保存数据时,保存成功则直接关闭窗口,保存失败则让用户确认是否关闭窗口,用户确认要关闭则关闭窗口…

【AI视野·今日CV 计算机视觉论文速览 第272期】Fri, 20 Oct 2023

AI视野今日CS.CV 计算机视觉论文速览 Fri, 20 Oct 2023 Totally 62 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Putting the Object Back into Video Object Segmentation Authors Ho Kei Cheng, Seoung Wug Oh, Brian Price, Joon Youn…

(二)docker:建立oracle数据库mount startup

这章其实我想试一下startup部分做mount&#xff0c;因为前一章在建完数据库容器后&#xff0c;需要手动创建用户&#xff0c;授权&#xff0c;建表等&#xff0c;好像正好这部分可以放到startup里&#xff0c;在创建容器时直接做好&#xff1b;因为setup部分我实在没想出来能做…

php对接飞书机器人

有同事接到对接飞书机器人任务&#xff0c;开发中遇到响应错误&#xff1a; {"code": 19021,"msg": "sign match fail or timestamp is not within one hour from current time" } 意思应该就是签名错误或者时间戳不在有效范围内等&#xff0c…

【Python】取火柴小游戏(巴什博弈)

火柴游戏&#xff1a;Python编程示例 当我们想要玩一个简单而有趣的游戏&#xff0c;同时又想锻炼自己的编程技能时&#xff0c;一个经典的选择就是火柴游戏。这个游戏的规则很简单&#xff1a;有一堆火柴&#xff0c;每次可以拿走1到6根&#xff0c;两名玩家轮流取火柴&#…

Java NIO

Java NIO 一&#xff0c;介绍 Java NIO&#xff08;New IO&#xff09;是 JDK 1.4 引入的一组新的 I/O API&#xff0c;用于支持非阻塞式 I/O 操作。相比传统的 Java IO API&#xff0c;NIO 提供了更快、更灵活的 I/O 操作方式&#xff0c;可以用于构建高性能网络应用程序。 …

京东数据分析:2023年9月京东白酒行业品牌销售排行榜

鲸参谋监测的京东平台9月份白酒市场销售数据已出炉&#xff01; 9月白酒市场的整体热度较高&#xff0c;贵州茅台先是与瑞幸联名推出酱香拿铁&#xff0c;后又宣布与德芙推出联名产品酒心巧克力&#xff0c;引起了诸多消费者的关注。在这一热度的加持下&#xff0c;从销售上看&…

深入理解Redis集群模式、协议、元数据维护方式

文章目录 &#x1f34a; 集群模式&#x1f34a; 集群协议&#x1f34a; 元数据维护方式&#x1f389; 集中式&#x1f389; gossip 协议 &#x1f4d5;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出…

第01章-Java语言概述

目录 1 常见DOS命令 常用指令 相对路径与绝对路径 2 转义字符 3 安装JDK与配置环境变量 JDK与JRE JDK的版本 JDK的下载 JDK的安装 配置path环境变量 4 Java程序的编写与执行 5 Java注释 6 Java API文档 7 Java核心机制&#xff1a;JVM 1 常见DOS命令 DOS&#xff08;…

52832 3通道ADC笔记

因为业务需要, 需要在52832上, 采集3个pin的电压. 52832的ADC, 分为什么single, 连续, 扫描模式 single就是只有一个通道并采集一次, 连续就是不停的扫描, 如果要捕捉声音之类, 就配合DMA, 连续不停的采集, 转换就行了. 扫描模式就是如果是多通道, 就一开始初始化多个通道, 存放…

Lua-http库写一个爬虫程序怎么样 ?

以下是一个使用Lua-http库编写的一个爬虫程序&#xff0c;该爬虫使用Lua语言来抓取www.snapchat.com的内容。 代码必须使用以下代码&#xff1a;get_proxy -- 导入所需的库 local http require("http") local json require("json")-- 定义爬虫IP服务器 …

安装docker ,更换docker版本

docker dockerd & containerd Dockerd&#xff08;Docker 守护进程&#xff09;在其底层使用 Containerd 来管理容器。Containerd 是一个开源的容器运行时管理器&#xff0c;由 Docker 公司于2017年开发并开源&#xff0c;它负责实际的容器生命周期管理。 以下是 Docker 守…

力扣每日一题49:字母异位词分组

题目描述&#xff1a; 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate&quo…