第六章:反射+设计模式

embedded/2024/12/20 14:16:56/
一、反射
1. 反射 (Reflection) :允许在程序运行状态中,可以获取任意类中的属性和方法,并且可以操作任意对象内部的属
性和方法,这种动态获取类的信息及动态操作对象的属性和方法对应的机制称为反射机制。
2. 类对象 和 类的对象 ( 实例 )
(1) 类的对象(实例):基于某个类 new 出来的对象,也称为实例对象。
(2) 类对象:类加载的产物,封装了一个类的所有信息(包、类名、父类、接口、属性、方法、构造方法等)
3. 获取类对象的三种方式:
(1) 通过类的对象,获取类对象
Student s = new Student();
Class c = s.getClass();
(2) 通过类名获取类对象
Class c = 类名 .class;
(3) 通过静态方法获取类对象
Class c=Class.forName(“ 包名 . 类名 ”);
注意:需要 权限类名:包名 . 类名
public class TestClass {
public static void main(String[] args) throws ClassNotFoundException {
// 深入 JVM 实现原理 / JVM 规范
// 通过反射技术 获取 类对象
Student s = new Student(); // 类的对象,实例
Class c=s.getClass(); // 获取类对象
System.out.println(c);
// 第二种方式:
Class c2=Class.forName("testflect.Student");
System.out.println(c2);
System.out.println(c==c2);
Class c3 = Student.class;
System.out.println(c3);
}
}
4. 反射常见的方法:
Class c = Class.forName("testflect.Student"); // 动态 操作类中信息
System.out.println(c.getName());// 获取类名
System.out.println(c.getPackage().getName());// 获取包名
System.out.println(c.getSuperclass().getName()); // 获取父类
Class[] cs=c.getInterfaces();// 获取 实现的接口
System.out.println(" 实现的接口数量为: "+cs.length);
for(Class inter:cs){
System.out.println(inter.getName());
}
Method[] ms = c.getMethods();// 获取公开方法:自定义 + 父类中
System.out.println("Student 类定义的方法数量为: "+ms.length);
for(Method m:ms){
System.out.println(m.getName());
}
System.out.println("--------------");
Method[] mds = c.getDeclaredMethods();// 获取自定义方法,包含非公开的
System.out.println("Student 类中自定义的方法为: "+mds.length);
for(Method m:mds){
System.out.println(m.getName());
}
System.out.println(" 获取属性: ");
Field[] fs = c.getDeclaredFields();// 获取自定义属性:包含非公开的
for (Field f:fs){
System.out.println(f.getName());
}
通过反射技术获取实例:
// 通过类对象 获取 类的对象
--- 采用无参数的构造方法获取对象
Class c = Class.forName("testflect.Student");
Object obj = c.newInstance();// 默认采用无参数的构造方法
Student s =(Student)obj;
s.setName(" 佳明 ");
s.setAge(28);
s.setScore(99.0);
System.out.println(obj);
-- 采用有参数的构造方法获取对象
System.out.println(" 利用有参数的构造方法获取对象: ");
Constructor con=c.getConstructor(String.class,Integer.class,Double.class);
Object obj2=con.newInstance(" 杨浩 ",37,88.0);
System.out.println(obj2);
// 利用反射技术操作私有化的方法
Method md=c.getDeclaredMethod("test")
md.setAccessible(true);
md.invoke(obj2);

http://www.ppmy.cn/embedded/147298.html

相关文章

[一招过] Python的正则表达式篇

Python 正则表达式(re模块) 正则表达式(regular expression)是用于匹配字符串的一种强大工具。Python 提供了 re 模块来处理正则表达式。通过正则表达式,可以快速匹配、查找、替换、分割字符串等。 1. re 模块基础 …

Selenium之execute_script()方法执行js脚本

目录 场景应用和使用 页面滚动 获取返回值 返回JavaScript定位的元素对象 修改元素属性 弹出提示框 场景应用和使用 在自动化测试中,部分场景无法使用自动化Selenium原生方法来进行测试: 滚动到某个元素(位置) 修改…

【C语言】库函数常见的陷阱与缺陷(一):字符串处理函数[2]--gets函数

C语言中的gets函数是一个用于从标准输入(通常是键盘)读取一行字符串的函数。然而,gets函数存在多个陷阱与缺陷,这些缺陷可能导致程序崩溃、安全漏洞或未定义行为。 一、gets功能与用法 gets函数的主要作用是从标准输入(通常是键盘)读取一行字符串,并将其存储在指定的缓…

AIGC:图像风格迁移技术实现猜想

定义以下函数: f(image) -> (style, content) g(style, content) -> image 函数f将图片(image)分解成风格(style)和内容(content)两部分 函数g将风格(style)和内容…

写入hive metastore报问题Permission denied: user=hadoop,inode=“/user/hive”

背景 使用Doris创建hive catalog后,想在hive上的库中创建一个表,报如下图片错误 解决办法 hdfs dfs -ls /看到如下图片所示,只有root用户有写的权限 所以通过export HADOOP_USER_NAMEroot将hadoop的用户名改成root,然后再hdfs…

鸿蒙Next状态管理优秀实践

在鸿蒙Next应用开发中,高效的状态管理对于提升应用性能至关重要。本文将介绍一些状态管理的优秀实践,帮助开发者避免常见的低效开发场景,提升应用质量。 一、使用ObjectLink代替Prop减少不必要的深拷贝 问题描述 在父子组件数值传递中&…

Visio——同一个工程导出的PDF文件大小不一样的原因分析

现象 在不同电脑,导出来的PDF文件大小不一样。 原因分析 文件小的未将字体嵌入,文件大的已经将字体嵌入了。

【数据集】玻璃门窗缺陷检测数据集3085张5类YIOLO+VOC格式

数据集格式:VOC格式YOLO格式 压缩包内含:3个文件夹,分别存储图片、xml、txt文件 JPEGImages文件夹中jpg图片总计:3085 Annotations文件夹中xml文件总计:3085 labels文件夹中txt文件总计:3085 标签种类数&am…