Java反射机制详解与使用方法大全!!!

news2025/4/5 5:02:39

❤ 作者主页:李奕赫揍小邰的博客
❀ 个人介绍:大家好,我是李奕赫!( ̄▽ ̄)~*
🍊 记得点赞、收藏、评论⭐️⭐️⭐️
📣 认真学习!!!🎉🎉

文章目录

  • Java反射机制简述
  • 1、四种方式获取Class类的对象
  • 2、获取class类对象的属性,构造和方法
  • 3、使用newInstance创建对象
  • 4、通过Constructor对象调用无参和有参方法
  • 5、使用反射动态调用有无参有无返回值的Method方法
  • 6、反射会破坏OOP对象
  • 7、方法重载
  • 8、setAccessible的作用

Java反射机制简述

  Java反射机制的核心时在程序运行时动态加载类并获取类的详细信息,从而可以调用类或对象的属性和方法。
  它的本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象和类的各种信息。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。

 

1、四种方式获取Class类的对象

  
前置:新建一个UserInfo实体类在com.jjl.domain下面
在这里插入图片描述

Class class1= UserInfo.class;
Class class2=new UserInfo().getClass();
Class class3=UserInfo.class.getClassLoader().loadClass("com.jjl.domain.UserInfo");
Class class4=Class.forName("com.jjl.domain.UserInfo");

 

2、获取class类对象的属性,构造和方法

  

public static void main(String[] args) {    
Class userInfoClass= UserInfo.class;    //属性列表    
Field[] a=userInfoClass.getDeclaredFields();      
//getFields()方法获取类的全部公共字段,getDeclaredFields()方法获取全部字段    
for(Field field:a){        
	System.out.println(field.getName());    
}    
//构造列表    
Constructor[] b=userInfoClass.getConstructors();    
for(Constructor constructor:b){        
	System.out.println(constructor.getName());    
}    
//方法列表    
Method[] c=userInfoClass.getDeclaredMethods();    
for(Method method:c){        
	System.out.println(method.getName());    
}}

 

3、使用newInstance创建对象

  

//不用new来创建对象,原理就是反射技术
String newObjectName="com.jjl.domain.UserInfo";
Class class4=Class.forName(newObjectName);
//newInstance开始创建对象
UserInfo userInfo=(UserInfo) class4.newInstance();

 

4、通过Constructor对象调用无参和有参方法

  

String newObjectName="com.jjl.domain.UserInfo";
Class class4=Class.forName(newObjectName);
Constructor constructor1=class4.getDeclaredConstructor();     //调用无参方法
UserInfo userInfo1=(UserInfo) constructor1.newInstance();
System.out.println(userInfo1.hashCode());
Constructor constructor=class4.getDeclaredConstructor(long.class,String.class,String.class);  //调用有参方法
System.out.println(constructor.newInstance(11,"a1","aa1").hashCode());
System.out.println(constructor.newInstance(12,"a2","aa2").hashCode());    //结果下图

 

5、使用反射动态调用有无参有无返回值的Method方法

String newObjectName="com.jjl.domain.UserInfo";
Class class4=Class.forName(newObjectName);
UserInfo userInfo=(UserInfo) class4.newInstance();
String methodName="test";
//调用无参无返回值的Method方法
Method method=class4.getDeclaredMethod(methodName);
System.out.println(method.getName());
method.invoke(userInfo);     //根据获取的方法,反射执行该方法  getName()获取名称,invoke()反射执行
//调用有参无返回值的Method方法
Method method=class4.getDeclaredMethod(methodName,String.class);
System.out.println(method.getName());
method.invoke(userInfo,"我的地址在北京");
//调用有参有返回值的Method方法
Method method=class4.getDeclaredMethod(methodName,Integer.class);
System.out.println(method.getName());
Object returnValue=method.invoke(userInfo,99999);
System.out.println("returnValue"+returnValue);

 

6、反射会破坏OOP对象

  单例模式由于构造方式式private的,不能new实例化对象,只有调用getOneInstance()获取自身对象,而且可以保证单例。但是使用反射技术能破坏OOP对象,导致可以创建出多个单例对象。

OneInstance o1=OneInstance.getOneInstance();    //单例模式(饱汉式) 保证当前进程只有一个实例对象
OneInstance o2=OneInstance.getOneInstance();
OneInstance o3=OneInstance.getOneInstance();
System.out.println(o1);
System.out.println(o2);
System.out.println(o3);
Class classRef=Class.forName("com.jjl.objectfactory.OneInstance");   //从这里开始使用反射实例化对象
Constructor c=classRef.getDeclaredConstructor();
c.setAccessible(true);
OneInstance one1=(OneInstance) c.newInstance();
OneInstance one2=(OneInstance) c.newInstance();
System.out.println(one1);
System.out.println(one2);

执行结果:
在这里插入图片描述

 

7、方法重载

  使用反射可以调用重载方法

public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
    Class class15=Test15.class;
    Object object=class15.newInstance();
    Method method1=class15.getDeclaredMethod("testMethod", String.class);
    Method method2=class15.getDeclaredMethod("testMethod", String.class,String.class);
    method1.invoke(object,"法国");
    method2.invoke(object,"中国","中国人");
}
public void testMethod(String username){
    System.out.println("public void testMethod(String username)");
    System.out.println(username);
}
public void testMethod(String username,String password){
    System.out.println("public void testMethod(String username,String password)");
    System.out.println(username+" "+password);
}

 

8、setAccessible的作用

  setAccessible功能是启用或禁用安全检查;具体的用处主要有两处,作用于方法上,method.setAccessible(true);作用于属性上field.setAccessible(true);
  将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查;实际上setAccessible是启用和禁用访问安全检查的开关,并不是为true就能访问为false就不能访问 ;
  由于JDK的安全检查耗时较多.所以通过setAccessible(true)的方式关闭安全检查就可以达到提升反射速度的目的
 


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

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

相关文章

Node.js学习笔记-03

七、网络编程 1. 构建 TCP 服务 TCP 是面向连接的协议,显著特征 在传输之前需要3次握手形成会话。 客户端 ——请求连接——> 服务器端 ——响应——> 客户端 ——开始传输——> 服务器端。 2. 构建 UDP 服务 3. 构建 HTTP 服务 http模块 在node中HTT…

电脑数据怎么加密?电脑数据加密软件有哪些?

在生活和工作中,我们总离不开电脑,而电脑中那些重要的数据,需要我们加密保护。那么电脑数据该怎么加密呢?电脑数据加密软件又有哪些呢?下面我们就来了解一下吧。 电脑数据加密软件 一般来说,常见的电脑加密…

Drools用户手册翻译——第四章 Drools规则引擎(十四)复杂事件处理(CEP)滑动窗口和内存管理

甩锅声明:本人英语一般,翻译只是为了做个笔记,所以有翻译错误的地方,错就错了,如果你想给我纠正,就给我留言,我会改过来,如果懒得理我,就直接划过即可。 目录 时间或长…

详解配置交换机多生成树MSTP+VRRP 的典型组网

详解配置交换机多生成树MSTPVRRP 的典型组网 组网: 1. 这是一个由三台交换机组成的倒三角型二层交换网络;网络中有4个VLAN:10、20、30、40;接口编号如图所示;SW3为接入层交换机,SW1、SW2为汇聚层交换机&am…

论文阅读 - Neutral bots probe political bias on social media

论文链接:Neutral bots probe political bias on social media | EndNote Click 试图遏制滥用行为和错误信息的社交媒体平台被指责存在政治偏见。我们部署中立的社交机器人,它们开始关注 Twitter 上的不同新闻源,并跟踪它们以探究平台机制与用…

linux自动程序

嵌入式linux下有软件需要自启动,只需要在/etc/init.d/rcS末尾添加所要启动的程序即可,开机就会自动运行 vi /etc/init.d/rcS在文件末尾添加 例:

Unity-Linux部署WebGL项目MIME类型添加

在以往的文章中有提到过使用IIS部署WebGL添加MIME类型使WebGL项目在浏览器中能够正常加载,那么如果咱们做的是商业项目,往往是需要部署在学校或者云服务器上面的,大部分情况下如果项目有接口或者后台管理系统,后台基本都会使用Lin…

对p-n结/AlGaN/GaN HEMTs中n-GaN掺杂浓度对栅极可靠性的影响

目录 第35届功率半导体器件与集成电路国际研讨会论文集2023年5月28日至6月1日,中国香港南方科技大学电气电子工程系,深圳标题:Impacts of n-GaN Doping Concentration on Gate Reliability of p-n Junction/AlGaN/GaN HEMTs摘要信息解释研究了…

MySQL基本语法总结

创建数据库 create database 数据库名; -- 字符集要看mysql 版本, 5.7 Latin, 8.0 utf8 create database 数据库名 character set ‘utf8’;-- 指定数据库的字符集 create database IF NOT EXISTS 数据库名 character se…

k8s-----集群调度

目录 一:调度约束 二:Pod 启动创建过程 三:k8s调度过程 1、Predicate 有一系列的常见的算法 2、常见优先级选项 3、指定调度节点 (1)nodeName指定 (2)nodeSelector指定 四:亲和…

数字工厂管理系统能给企业管理者带来哪些好处

数字工厂管理系统是现代企业管理的神器,它能够以数字化方式管理企业的生产过程,实现生产过程的自动化、智能化和可视化。数字工厂管理系统解决方案不仅提高了生产效率,还给企业管理者带来了很多好处。下面就让我们来详细了解一下。 首先&…

【Android】MVC,MVP,MVVM三种架构模式的区别

MVC 传统的代码架构模式,仅仅是对代码进行了分层,其中的C代表Controller,控制的意思 将代码划分为数据层,视图层,控制层,三层之间可以任意交互 MVP MVP是在MVC基础上改进而来的一种架构,其中的…

2023年10款常用的Mac工具合集

Typora Typora 是一款由 Abner Lee 开发的轻量级 Markdown 编辑器,与其他 Markdown 编辑器不同的是,Typora 没有采用源代码和预览双栏显示的方式,而是采用所见即所得的编辑方式,实现了即时预览的功能,但也可切换至源代…

帆软设计器:报表超链接“删除”后仍会打开链接的问题

这个问题是在使用帆软报表设计器(版本 10.0)发现的。当直接在决策报表的某个报表下点击 “特效-超级链接” 、并去掉了里面的超链接之后,刷新报表还是鼠标悬浮上去就是一个链接的样子。 找到报表所在单元格 “单元格元素” 的“特效” 配置&a…

【操作系统】操作系统知识点总结(秋招篇)

文章目录 前言操作系统主要做了哪些工作?进程 线程 协程之间的区别进程的组成部分介绍一下进程的PCB讲一下进程的五态 以及它们的状态转移用户态和内核态是什么?进程在用户态和内核态之间是如何切换的讲一下进程之间的通信方式讲一下进程调度的三个层次介…

广州华锐互动:VR3D课程在线教育平台为职业院校提供沉浸式的虚拟现实学习体验

随着科技的飞速发展,虚拟现实(VR)和增强现实(AR)技术已经逐渐渗透到我们生活的各个领域。其中,VR3D课程在线教育平台作为一种新兴的教育方式,正在逐渐改变我们的学习方式和体验。本文将详细介绍VR3D课程在线教育平台的应用前景及特点。 VR3D课…

matplotlib 笔记 plt.grid

用于添加网格线 主要参数 visible 布尔值,True表示画网格 which表示要显示的刻度线类型,可以是 major(主刻度)或 minor(次刻度),或者同时显示(both)alpha 透明度 …

【Linux的开胃小菜】常用的RPM软件包与YUM仓库包管理器使用

一、系统初始化进程 systemd与System V init的区别以及作用: System V init运行级别systemd目标名称systemd目标作用0poweroff.target关机1rescue.target单用户模式2multi-user.target多用户的文本界面3multi-user.target多用户的文本界面4multi-user.target多用户…

数字万用表测量基础知识--使用DMM测量电阻

概览 DMM(即数字万用表)是一种电气测试和测量仪器,可测量直流和交流信号的电压、电流和电阻。本文介绍如何正确使用和理解数字万用表(DMM)。 使用DMM测量电阻 电阻测量通常用于测量电阻器或其他组件的电阻,如传感器或扬声器。电…

【腾讯云 Cloud Studio 实战训练营】基于Cloud Studio构建React完成点餐H5页面

前言 【腾讯云 Cloud Studio 实战训练营】基于Cloud Studio 构建React完成点餐H5页面一、Cloud Studio介绍1.1 Cloud Studio 是什么1.2 相关链接1.3 登录注册 二、实战练习2.1 初始化工作空间2.2 开发一个简版的点餐系统页面1. 安装 antd-mobile2. 安装 less 和 less-loader3. …