首页 > 其他分享 >反射相关API

反射相关API

时间:2024-09-20 20:01:20浏览次数:9  
标签:反射 对象 class 获取 API constructor 相关 Class cls

反射的作用
在不修改源码的情况下,扩展功能。
程序在运行的时期,通过反射机制,获取类的所有内部信息,并且操作类的对象。


Class类

  • 一个类在堆中只有一个Class对象,这个Class对象包含了类的完整结构信息
  • 反射技术是针对Class对象进行操作,在程序运行的时候,动态获取类中的所有成员

[1] Class类 常用方法

通过类的全路径名 获取Class对象

获取类加载器

获取实例对象

获取构造器对象

获取成员属性对象

获取成员方法对象

[2] 获取Class类对象

获取Class类对象的4种方式

基本类型和包装类型的Class对象
  • int.class
  • char.class
  • Integer.TYPE
  • Charater.TYPE
其它类型的Class对象


Constructor类


创建实例对象

//获取Class类对象
Class<?> clazz = Class.forName(className);
//获取空参构造器对象
Constructor<?> constructor = clazz.getConstructor();
Student stu= (Student)constructor.newInstance();

//获取有参构造器对象
Constructor<?> constructor = clazz.getConstructor(String.class,int.class);
Student stu= (Student)constructor.newInstance("www", 50);

Field类

  • 设置值:set​( 实例对象, 值 )
  • 获取值:get​( 实例对象 )
  • 静态属性:set​( null, 值 ) / get​( null )

Method类


使用反射的步骤


应用实例

使用反射 - 创建对象

//1.获取User类的Class对象
Class<?> cls = Class.forName("com.java.test.Student");

//2.无参构造器创建对象
Object o = cls.newInstance();

//3.有参构造器创建对象
Constructor<?> constructor = cls.getConstructor(int.class, String.class);
Object o2 = constructor.newInstance(1000, "hello");

//4.私有有参构造器创建对象
Constructor<?> declaredConstructor = cls.getDeclaredConstructor(String.class);
declaredConstructor.setAccessible(true);
Object o3 = declaredConstructor.newInstance("jack");

\

使用反射 - 操作属性

//获取Class对象
Class<PrivateTest> cls = PrivateTest.class;
//使用Class类对象,创建实例对象
PrivateTest o = cls.newInstance();

//获取指定的字段对象
Field nameFieldObj = cls.getDeclaredField("name");
nameFieldObj.setAccessible(true);
nameFieldObj.set(o,"汪汪");

//获取指定的方法对象
Method getNameObj = cls.getMethod("getName");
System.out.println(getNameObj.invoke(o));

\

使用反射 - 调用方法

  1. 获取Class类对象
  2. 获取所有的成员方法对象:getDeclaredMethods​( )
  3. 取消访问检查:setAccessible(true);
  4. 调用方法:invoke​( )
  5. 接收方法的返回值:在使用反射中,如果方法有返回值,只会返回Object类型

\

通过配置文件,创建对象并调用方法

配置文件

classfullpath=com.reflectiontest.demo.domain.Cat
method=hi
name=zhangsan
age=19


main方法

//1. 通过类加载器读取src目录下的配置文件
// 获取类加载器
ClassLoader clazzLoader = DemoTest02.class.getClassLoader();
// 读取配置文件
InputStream is = clazzLoader.getResourceAsStream("stu.ini");

Properties pro = new Properties();
pro.load(is);
String classfullpath = pro.getProperty("classfullpath");
String method = pro.getProperty("method");
String name = pro.getProperty("name");
int age = Integer.parseInt(pro.getProperty("age"));


//2.使用反射技术
//根据全类名获取Class对象
Class<?> cls = Class.forName(classfullpath);

//通过Class类 获取对象实例
Object o = cls.newInstance();
//获取空参构造器对象
Constructor<?> constructor = clazz.getConstructor();
Student stu= (Student)constructor.newInstance();
//获取有参构造器对象
Constructor<?> constructor = clazz.getConstructor(String.class,int.class);
Student stu= (Student)constructor.newInstance("www", 50);

//操作属性   
System.out.println("--通过Field对象获取私有属性的值--");
Field nameObj = cls.getDeclaredField("name");
nameObj.setAccessible(true);
System.out.println(nameObj.get(o));//获取属性的值
nameObj.set(o,"newName");//设置属性的值
    
//操作方法
//获取Method对象
Method methodObj1 = cls.getMethod(method);
//通过Method对象调用方法
methodObj1.invoke(o);

标签:反射,对象,class,获取,API,constructor,相关,Class,cls
From: https://www.cnblogs.com/meitianyouheng/p/18423190

相关文章

  • 操作系统相关
    操作系统1.操作系统主要功能进程管理功能:创建、调度、终止进程,管理进程的执行。目的:确保多个进程能够有效地共享处理器资源,并进行合理的调度和管理。内存管理功能:分配和管理系统内存,包括虚拟内存和物理内存。目的:提供程序执行所需的内存空间,并保护进程之间的内存隔......
  • 基于 ollama 下载,部署AI 大模型 提供API 服务
    1.下载 ollama   https://ollama.com/   2.安装完成后,没有操作界面(只能CLI)3. 检测安装是否成功 ollama--version4.常用命令: ollamahelp修改默认模型下载位置:‌概述‌:Ollama默认将模型保存在‌C盘(‌Windows)、~/.ollama/models(‌MacOS)或/usr/share/ollama/.......
  • 【理论篇】数据挖掘 第六章 挖掘频繁模式、关联和相关性:基本概念和方法(上)
    说明:文章为《数据挖掘:概念与技术原书第03版》的学习笔记,该书是数据挖掘领域的经典之作,想了解更多内容请参阅原著。一、频繁模式基本概念        模式:通常指的是数据中的一种规律、趋势或特征,可以是单一的特征、属性,也可以是多个特征之间的关系或组合;      ......
  • 在 ASP.NET Core Web API 中使用异常筛选器捕获和统一处理异常
    前言在ASP.NETCoreWebAPI中,异常筛选器(ExceptionFilter)是一种用于处理发生在WebAPI控制器或管道中的异常的机制。异常筛选器可以捕获和处理应用程序中发生的异常,当系统中出现未经处理的异常的时候,异常筛选器就会执行,我们可以在异常筛选器中对异常进行处理,例如记录日志......
  • Capital许可使用规定
    在软件应用日益广泛的今天,合规使用软件许可已成为企业不可或缺的法律义务。Capital许可使用规定,正是为了保障软件用户的合法权益,促进软件产业的健康发展而制定的重要规范。一、Capital许可使用规定的重要性Capital许可使用规定是软件许可协议的核心内容,它明确了软件用户在使用Ca......
  • asp.net webapi 控制器中获取appsettings.json 中的数组对象
    appsettings.json文件内容: {"Logging":{"LogLevel":{"Default":"Information","Microsoft.AspNetCore":"Warning"}},"MyConfigKey":"MyConfigValue"......
  • 快速上手高德JS API——以可视化公交站点线路为例
    前言在利用高德地图进行开发时,我们经常需要使用不同的API来实现特定的功能。为了帮助开发者快速定位所需API并掌握正确的使用方法,本文将以可视化任意公交站点路线为例,分享相关经验。根据需求粗略匹配参考示例在开始写代码我都会思考一下该功能的实现逻辑是什么:1、通过什么方式......
  • 多语言长文本 AI 关键字提取 API 数据接口
    多语言长文本AI关键字提取API数据接口AI/文本专有模型极速提取多语言长文本/实时语料库。1.产品功能支持长文本关键词提取;多语言关键词识别;基于AI模型,提取精准关键词;全接口支持HTTPS(TLSv1.0/v1.1/v1.2/v1.3);全面兼容AppleATS;全国多节点CDN部署;......
  • 为什么企业需要空号检测API接口
    在移动互联网蓬勃发展的今天,手机已深深融入我们的日常生活中,它提供了一种直接而便利的沟通渠道。对于商业活动来说,特别是那些采用手机短信或电话作为主要通信方式的行业,比如金融、电商和营销等,良好的沟通效果对于他们来说至关重要。然而,在这个过程中,一项让他们苦恼的问题就是如......
  • 函数及其所有相关知识点详解及实例
    一、JavaScript函数基础在JavaScript中,函数是一等公民,这意味着函数可以像其他数据类型一样被传递和操作。函数可以封装代码块,提高代码的复用性和解耦性。1.函数声明定义函数: function自定义函数名(){}调用函数: 函数名()functionadd(a,b){returna+b......