首页 > 其他分享 >反射的概念和使用

反射的概念和使用

时间:2024-07-01 18:55:37浏览次数:16  
标签:反射 class Method 概念 使用 命名 Class 类名 属性

反射的概念

 反射是框架设计的灵魂,就是在类运行期间把类中成员抽取为其他类的过程

为什么使用反射

反射就是为了解决在运行期间对某个实例一无所知的情况下调用其方法和属性

获取class反射类的三种方式

一、通过类名.class属性
    Class<泛型> 命名 = 类名.class;
二、通过类路径获取
    Class 命名 = Class.forName("com.路径.精确到具体类名");
三、通过对象名获取反射类型
    类名 命名1 = new 类名();
	Class 命名 = 命名1.getClass();

Class类常用方法

public static void main(String[] args) throws Exception{
	Class<泛型> 命名1 = 类名.class;	
	//通过反射类创建类对象	newInstance()
    类名 命名 = 命名1.newInstance();
    //获取反射类的注解对象	getAnnotation()
    注解类名 命名 = 命名1.getAnnotation(注解类名.class);
}

获取Method方法类对象

public static void main(String[] args) throws Throwable(){
	Class<泛型> 命名1 = 类名.class;
    //得到本类中定义的所有Method类对象	getDeclaredMethods()
    Method[] 命名2 = 命名1.getDeclaredMethods();
    for(Method 命名 : 命名2){
        通过遍历获取每一个本类中定义的Method类对象
    }
    
     //获取本类中指定的方法对象	getDeclaredmethod()
    Method 命名 = 命名1.getDeclaredMethod("方法名", 参数类型.class);
   
    //获取本类和父类所有public方法对象	getMethods()
    Method[] 命名3= 命名1.getMethods();
    for(Method 命名 : 命名3){
        遍历获取本类和父类的每一个public方法
    }
    
    //获取本类和父类指定的public方法对象	getMethod()
    Method 命名 = 命名1.getMethod("方法名", 参数类型.class);
}

Method类对象中常用方法

public static void main(String[] args) throws Exception{
    //?表示泛型通配符||占位符
    Class<?> 命名1 = Class.forName("com.路径具体到类名");
    Object 命名2 = 命名1.newInstance();
    Method 命名3 = 命名1.getMethod('方法名');
    
    //执行方法,返回方法执行结果 invoke(Object对象, 参数值)
    Object 命名 = 命名3.invoke(命名2);
    
    //私有方法不能被反射调用 需要使用强力反射
   	Method 命名4 = 命名1.getDeclaredMethod("方法名");
    命名4.setAccessible(true);	//设置为允许访问
    Object 命名 = 命名4.invoke(命名2)
}

获取Field属性对象的方式

getDeclaredField() 获取本类指定的属性对象

getDeclaredFields() 获取本类所有的属性对象

getField() 获取本类和父类中public修饰的属性

getFields() 本类和父类中所有public属

public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException {
	Class<泛型> 命名1 = 类名.class;
	类名 命名= 命名1.newInstance();
    Field 命名 = 命名1.getDeclaredField("属性名");
}

Field类中常用方法

Class<泛型> 命名1 = 类名.class;
类名 命名2 = 命名1.newInstance();  //等价于===new 类名()
Field 命名3 = 命名1.getDeclaredField("属性名");
//为属性赋值,如果是私有属性同样需要强力反射设置允许访问	set(Object对象, 值)
命名3.set(命名2, "属性值");	//等价于===类名.set属性名("属性值")

//获取属性名
Field[] 命名4 = 命名1.getDeclaredFields();
for(Field 命名5 : 命名4){
    //获取属性名
    命名5.getName();
    //获取每个属性对象上的注解对象
    注解类名 命名 = declaredField.getAnnotation(注解类名.class);
}

示例

properties属性文件指定类路径,通过反射完成类对象创建和类中属性赋值

public static void main(String[] args) throws Exception{
    //加载属性文件
    InputStream 命名1 = 当前文件名.class.getClassLoader().getResourceAsStream("属性文件名.properties");
    //通过属性类Properties
    Properties 命名2 = new Properties();
    命名2.load(命名1);
    //属性类读取属性文件中指定key值
    String 命名3 = 命名2.getProperty("属性文件中属性名");
    //根据类路径得到反射对象
    Class<?> 命名4 = Class.forName(命名3);
    //根据反射类创建类对象
    Object 命名7 = 命名4.newInstance();
    //为属性赋值
    Field[] 命名5 = 命名4.getDeclaredFields();
    for(Field 命名6 : 命名5){
        命名6.setAccessible(true);
        field.set(命名7, 属性值);
    }
}

标签:反射,class,Method,概念,使用,命名,Class,类名,属性
From: https://blog.csdn.net/Baizeh/article/details/140107896

相关文章

  • 如何使用 Services.AddDistributedMemoryCache
    参考资料:https://www.cnblogs.com/RainFate/p/16920591.html AI生成:在.NETCore中,Services.AddDistributedMemoryCache()方法用于注册分布式内存缓存。这是一个内存中的缓存解决方案,适用于需要在多个服务器或服务之间共享缓存数据的分布式系统。如何使用AddDistributedMemory......
  • ubuntu 使用自己的双目相机发布 ROS
    https://blog.csdn.net/KID_yuan/article/details/101272384https://blog.csdn.net/weixin_53073284/article/details/125671358ls/dev/video*//插上摄像头后打开终端查看是否检测到摄像头mkdir-pcamera_ws/src//新建工作空间......
  • linux使用tftp命令上传文件
    tftp-g-rup.rar192.168.1.249是使用TFTP(TrivialFileTransferProtocol)从指定的服务器(192.168.1.249)下载文件(up.rar)的命令。tftp:是TFTP命令行客户端的命令名称。-g:表示使用TFTP客户端的"get"模式,用于从服务器获取文件。-rup.rar:指定要下载的文件名称为"u......
  • 深度测评:ONLYOFFICE 8.1 的安装与使用——功能全面的 PDF 编辑器、幻灯片版式、优化电
    目录一、引言二、ONLYOFFICE简介三、安装1.Windows/Mac安装2.文档开发者版安装四、使用1.功能全面的PDF编辑器2.无缝切换文档编辑、审阅和查看模式3.改进从右至左语言的支持&新的本地化选项五、总结一、引言ONLYOFFICE8.1是AscensioSystemSIA......
  • [开源分享]好用的在线客服系统 PHP客服系统源码 聊天源码(开源代码+终身使用+安装教程
    源码介绍PHP在线客服系统源码采用全新UI,重新设计前端界面,后台采用php+mysql,免费开源源码。在线客服系统已成为企业与客户之间沟通的重要渠道。通过在线客服系统,企业可以方便地与客户进行实时沟通和解决问题,提升客户满意度。php客服系統源码主要功能要求:全新UI自动回复和机器......
  • 如何在OKR中正确使用“自上而下+自下而上”的
    在我们最近的OKR迭代中,我们先是以战略团队定义的公司OKR为基础。然后,我们与各团队一起举办研讨会,以公司的OKR为准则,提出他们自己的团队OKR。通过这种方法,团队有更多的自由来定义他们自己的OKR。在某些情况下,团队自己承担了公司的OKR。有效的方法:团队对自己的OKR有了......
  • 【Redis持久化】RDB、AOF介绍和使用
    RDB、AOF介绍和使用引言ROB介绍配置指令介绍使用指令:dump文件修复指令快照禁用AOF工作流程:文件重写:三种写回策略:混合使用引言持久化的目的,其实就是在Redis重启或者中途崩溃的时候能够依靠自身恢复数据,而不需要再次访问MySQL数据库,重新取得数据,增加MySQL的工作量。在此有两种方法,R......
  • ros microros 使用超声波雷达测量距离
    我们使用的超声波模块一共有四个引脚,分别是TRIG即发送引脚,用于发送超声波ECHO即接收引脚,用于接收反射回来的超声波VCC电源接5VGND电源地一、新建工程新建example18_sr04二、编写代码带注释的代码如下#include<Arduino.h>#defineTrig27//设定SR04连接的Arduino引脚......
  • Kindle 终止中国在线服务 用户如何继续使用推送服务
    2024年6月30日,根据亚马逊公告Kindle中国电子书店正式停止云端下载服务。即日起,未下载的电子书将无法下载和阅读,用户也无法从应用商店下载KindleAPP,同时,Kindle客户服务也将停止支持。虽然Kindle中国服务停止,但用户仍可以通过切换到美区和其他地区的亚马逊账号来继续......
  • MySQL 使用 ALTER TABLE 语句修改表结构的方法
    MySQL使用ALTERTABLE语句修改表结构的方法基本概念与作用作用说明完整代码示例示例一:添加新列示例二:修改列的数据类型示例三:删除列示例四:重命名列示例五:添加约束示例六:删除约束示例七:更改表名示例八:更改表的存储引擎功能使用思路实际工作开发技巧在数据库开发......